繁体   English   中英

DirectX 11基于旋转移动对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM