2013-01-11 66 views
8

我有我的Direct3D11应用程序,我试图解决几个小时已经有一个奇怪的问题。问题在于方法:矩阵造成崩溃

void CameraClass::Render() 
{ 
    XMFLOAT3 sUp, sLookAt, sRotationInRadians; 

    sUp.x = 0.0f; 
    sUp.y = 1.0f; 
    sUp.z = 0.0f; 

    sLookAt.x = 0.0f; 
    sLookAt.y = 0.0f; 
    sLookAt.z = 1.0f; 

    sRotationInRadians.x = m_Rotation.x * 0.0174532925f; 
    sRotationInRadians.y = m_Rotation.y * 0.0174532925f; 
    sRotationInRadians.z = m_Rotation.z * 0.0174532925f; 

    XMVECTOR vecLookAt = XMVectorSet(sLookAt.x, sLookAt.y, sLookAt.z, 0.0f); 
    XMVECTOR vecUp = XMVectorSet(sUp.x, sUp.y, sUp.z, 0.0f); 
    XMVECTOR vecPosition = XMVectorSet(m_Position.x , m_Position.y, m_Position.z, 0.0f); 

    XMMATRIX RotationMatrix(XMMatrixRotationRollPitchYaw(sRotationInRadians.x, sRotationInRadians.y, sRotationInRadians.z)); 

    vecLookAt = XMVector3TransformCoord(vecLookAt, RotationMatrix); 
    vecUp = XMVector3TransformCoord(vecUp, RotationMatrix); 

    vecLookAt += vecPosition; 

    m_ViewMatrix = XMMatrixLookAtLH(vecPosition, vecLookAt, vecUp); 
} 

一切都很好,直到到达该行:

m_ViewMatrix = XMMatrixLookAtLH(vecPosition, vecLookAt, vecUp); 

不知怎的,它会导致应用程序崩溃(切换到不回应是正确的)。

这里是实际调用什么样子:

XMMATRIX ViewMatrix; 
XMMATRIX ProjectionMatrix; 
XMMATRIX WorldMatrix; 

m_D3D->BeginScene(0.0f, 0.0f, 0.0f, 1.0f); 

m_Camera->Render(); 

m_D3D->GetWorldMatrix(WorldMatrix); 
m_D3D->GetProjectionMatrix(ProjectionMatrix); 

在前进,顶点和像素着色编译就好了,所以这不是一个问题。 很可能我在xnamath上做了一些错误(我对它完全陌生),但我不知道地球上会发生什么。提前致谢。如果需要,我会提供更多信息。

编辑 @ 1:经过几十次更改,我设法让Projection和World矩阵起作用。虽然我仍然无法设置视图矩阵。我改变了代码,所以它匹配了实际的代码,并摆脱了不重要的东西。

编辑 @ 2:从最后一分钟速报:有没有与XMMatrixLookAtLH功能的问题,因为我决定将结果保存到局部变量和它的作品,但如果我想分配结果矩阵类成员然后我得到崩溃。这非常有趣。

+0

尝试调试该方法,并查看m_ViewMAtrix指针的值是什么? –

+0

好吧,我得到这个完全相同的错误。当代码尝试计算XMMatrixLookAtLH或任何XNA函数时,代码只是神秘地崩溃。 – Caesar

+1

尝试了一些东西后,我终于通过将我的模式设置为64x构建来实现它。尽管如此,仍然在寻找答案。 – Caesar

回答

5

经过很多小时的试图解决这个问题,我相信我终于解决了它。

XMMATRIX表示一个16字节对齐的矩阵,当您试图复制该值时,XMMATRIX的未对齐分配会导致此错误。这将解释为什么它不总是发生,为什么它在不同的模式下工作。

我发现这个问题的最佳解决方案是使用XMFLOAT4X4存储值。

下面是一个简单的例子:

#include <windows.h> 
#include <xnamath.h> 

class Camera 
{ 
protected: 
    XMFLOAT4X4 view_; 
public: 
    XMFLOAT4X4 const& Update() 
    { 
     XMStoreFloat4x4(&this->view_ , XMMatrixIdentity()); 
     return this->view_; 
    } 
}; 

int main() 
{ 
    Camera* cam = new Camera; 
    XMFLOAT4X4 const& mat = cam->Update(); 
    XMMATRIX x = XMLoadFloat4x4(&mat); 
} 
+0

只看到你的问题 - 我前段时间有同样的问题,这也是答案。事实上,这几乎是微软推荐无论如何.. – jcoder

+0

@jcoder我只是希望他们更清楚。 – Caesar

+0

仅供参考http://msdn.microsoft.com/en-gb/library/windows/desktop/ee418725(v=vs.85).aspx(这是得到directxmath,而不是旧的xnamath,但它大致相同) – jcoder

3

由于碰撞发生在分配: m_ViewMatrix = XMMatrixLookAtLH(...

,比x86的构建在x64的相处得更好蹒跚我将承担m_ViewMatrix或者它的容器m_Camera被映射到一个与其他东西共享的内存空间中。内存切换。向64位移动是另一个指示器,因为可能会移动内存来隐藏问题。你如何分配m_Camera字段?什么是一切的主要容器?

发布完整的CameraClass标题和分配它的位置。此外,尝试在田地周围的一些阵列洒水,看看是否有帮助。这将表明内存破坏也是。

+0

似乎我不能编辑帖子,因为我不是原始的海报。但如果你想看看我的代码审查修订或查看它在这里github https://github.com/mmajeed-Fanshawe/XNAError – Caesar

+0

我想问一下,什么处理器和操作系统是这个问题上发生? – GMasucci

+2

@GMasucci Windows 7,请阅读我的答案,看看灵魂 – Caesar