c++ - 导致崩溃的矩阵

标签 c++ matrix direct3d11 xna-math-library

我的 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:经过数十次更改,我设法让投影和世界矩阵发挥作用。虽然我仍然无法设置 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);
}

关于c++ - 导致崩溃的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288386/

相关文章:

c++ - 我必须删除这个对象吗? (如果我不打算被删除)

c++ - Direct3D 11 - HLSL - 获取顶点索引 ID

c++ - 我正在尝试为正方形设置棋盘纹理

c++ - 类成员 `B` 的析构函数,为什么在下面的代码片段中调用它?

c++ - 如何将 AERT_Allocate 与 std :vector 一起使用

c++ - 从独立程序创建共享库 - 如何处理 "int main()"?

r - 在 R 中找到矩阵的相邻元素

python - 用递增序列填充连续的零序列

python - 从协方差矩阵中查找高斯拟合误差

c++ - 常量缓冲区中的纹理变换矩阵无法正常工作