[英]directx 11 move object based on rotation
嗨,我是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 )
PS我推荐DirectX Toolkit库用于这类事情。 特别是如果您不熟悉DirectX。 SimpleMath.h标头包含这些向量和矩阵周围易于使用的包装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.