您好,我是 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/