您好我刚接触使用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();
}
答案 0 :(得分:1)
矩阵在顶行中不包含缩放,在第二行中包含旋转,在第三行中不包含平移。它们比那更复杂。
要分解矩阵,可以使用XMMatrixDecompose。要进行组合,您可以使用XMMatrixTranslationFromVector,XMMatrixRotationQuaternion,XMMatrixScalingFromVector,并将结果相乘。
幸运的是,要移动对象的局部坐标(如果这是你想要的),你不需要分解矩阵。您需要使用localTranslation
构建XMMatrixTranslationFromVector
矩阵,并将您的世界矩阵更新为XMMatrixMultiply( localTranslation, _world )
P.S。我推荐DirectX Toolkit library来做这类事情。特别是如果你是DirectX的新手。 SimpleMath.h头文件包含围绕这些向量和矩阵的易于使用的包装器。