8 c++ matrix xna-math-library direct3d11
我的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 );
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到达到那条线:
m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );
Run Code Online (Sandbox Code Playgroud)
不知何故,它会导致应用程序崩溃(切换到无响应是正确的).
这是实际调用的样子:
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 );
Run Code Online (Sandbox Code Playgroud)
事先,Vertex和Pixel着色器编译得很好,所以这不是问题.最有可能的是我对xnamath做错了(我对它完全是新的),但是我不知道地球上有什么可能.提前致谢.如果需要,我会提供更多信息.
编辑 @ 1:通过几十次更改,我设法让Projection和World矩阵起作用.虽然我仍然无法设置View矩阵.我更改了代码,因此它与实际代码匹配,并删除了不重要的内容.
编辑 @ 2:来自最后一分钟的新闻:XMMatrixLookAtLH函数没有问题,因为我决定将结果保存到局部变量并且它可以工作,但是如果我想将结果矩阵分配给类成员那么我得到了崩溃.这当然很有趣.
花了几个小时试图解决这个问题,我相信我终于解决了它.
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);
}
Run Code Online (Sandbox Code Playgroud)