directx 11基于旋转移动对象

时间:2017-01-04 17:15:29

标签: 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();
}

1 个答案:

答案 0 :(得分:1)

矩阵在顶行中不包含缩放,在第二行中包含旋转,在第三行中不包含平移。它们比那更复杂。

要分解矩阵,可以使用XMMatrixDecompose。要进行组合,您可以使用XMMatrixTranslationFromVector,XMMatrixRotationQuaternion,XMMatrixScalingFromVector,并将结果相乘。

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

P.S。我推荐DirectX Toolkit library来做这类事情。特别是如果你是DirectX的新手。 SimpleMath.h头文件包含围绕这些向量和矩阵的易于使用的包装器。