c++ - directx 11 基于旋转移动对象

标签 c++ rotation directx

您好,我是 DirectX 11 的新手,我只是想让我的游戏对象根据它的旋转向前移动。这就是我所拥有的,但无论我是否转动它,它都只是在一条直线上移动。

void Object::MoveObject(float x, float y, float z)
{

    Position.x += x;
    Position.y += y;
    Position.z += z;

    _translate = XMMatrixIdentity();
    _translate *= XMMatrixTranslation(Position.x, Position.y, Position.z);

    XMVECTOR forward = { Position.x,Position.y,Position.z };
    XMFLOAT4X4 currrentWorld = GetWorld();
    XMMATRIX currentWorldM = XMLoadFloat4x4(&currrentWorld);

    XMVECTOR scale = currentWorldM.r[0];
    XMVECTOR rotation = currentWorldM.r[1];
    XMVECTOR translation = currentWorldM.r[2];
    forward *= currentWorldM.r[3];

    forward = XMVector3Normalize(forward);

    translation = XMVectorAdd(translation, forward);

    XMStoreFloat4x4(&_world, XMMATRIX(scale, rotation, translation, forward));

    UpdateWorld();
}

最佳答案

矩阵不包含第一行的比例,第二行的旋转和第三行的平移。它们比这更复杂。

要分解矩阵,可以使用 XMMatrixDecompose。要合成回来,您可以使用 XMMatrixTranslationFromVector、XMMatrixRotationQuaternion、XMMatrixScalingFromVector,并将结果相乘。

幸运的是,要在它的局部坐标中移动对象(如果这是你想要的),你不需要分解矩阵。您需要使用 XMMatrixTranslationFromVector 构造一个 localTranslation 矩阵,并将您的世界矩阵更新为 XMMatrixMultiply( localTranslation, _world )

附言我推荐DirectX Toolkit library对于那种事情。特别是如果您是 DirectX 的新手。 SimpleMath.h header 包含围绕这些 vector 和矩阵的易于使用的包装器。

关于c++ - directx 11 基于旋转移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41469631/

相关文章:

C# directx Sprite 原点

python - 使用PIL的粘贴方法时的透明度问题

android - 在 Android < API 级别 11 中旋转 ImageView

windows-7 - 修复 Windows 7 上的 DirectX 7 延迟问题吗?

c++ - directx c++ 相机运动

c++ - 错误 C1083 无法打开包含文件 : 'opencv2\opencv.hpp' in VS 2015

c++ - 我怎样才能允许将 vector 传递给 INFO()、CAPTURE()、WARN() 等,同时避免非法扩展 std namespace ?

c++ - 如何将 16 位 unsigned int 转换为 8 位 unsigned char 并最终返回 unsigned char*?

c++ - minGW(使用 g++ 4.7.1)不编译简单的 C++11 代码(在 WinVista 下)

c++ - Direct3D11(C++) : Rendering (basic) question