翻译 - 旋转 - 使用XMMATRIX翻译

时间:2015-08-05 01:59:04

标签: matrix rotation direct3d

如果我所知道的只是一个物体的世界矩阵(因为它的x / y / z位置没有被跟踪,这会更容易),我该如何围绕它的中心旋转呢?

如果我知道这个位置,它就像这样简单:

        XMMATRIX world = pMissile->GetWorldMatrix(); 

        XMMATRIX matrixTranslation = XMMatrixTranslationFromVector(pMissile->GetPosition());
        XMMATRIX matrixInvTranslations = XMMatrixInverse(nullptr, matrixTranslation);

        float rotationAmount = (60 * XMConvertToRadians((float)fElapsedTime / 2.0f));

        XMMATRIX missileWorld = world * 
                    matrixInvTranslations 
                    * XMMatrixRotationX(rotationAmount) 
                    * XMMatrixRotationY(rotationAmount)
                    * XMMatrixRotationZ(rotationAmount)
                    * matrixTranslation;        
        pMissile->SetWorldMatrix(missileWorld);

不幸的是,由于我不知道这个位置,我不知道该怎么做。基本上我需要能够从世界矩阵中获得“翻译回原点”。在我开始从矩阵中拉出元素之前,必须有DirectX或DirectXTK函数来执行此操作,不是吗?

目前我正在分解矩阵以获取它:

        XMVECTOR vectorTranslation, vectorScale, rotationQuat;
        XMMatrixDecompose(&vectorScale, &rotationQuat, &vectorTranslation, world)

如果这是正确/最好的方式,请告诉我!

有点切向,正如你所看到的那样,我使用平移的反转来“将它移回”原来的位置,然后我将其转换为旋转原点。很多样本都跳过了这个 - 有没有我缺少的东西,你不需要 - 最后翻译回去?

1 个答案:

答案 0 :(得分:1)

XMMatrixDecompose是获取任意变换矩阵元素的正确,完全通用的方法。计算成本很高,因此大多数人都假设矩阵中的内容 - 因为它们在所有点都控制它。例如,避免非均匀缩放可以真正简化事情。

许多游戏专门使用旋转和平移,并避免缩放或至少避免非均匀缩放。您可以通过仅转置上面的3x3元素然后取消最后一行的x,y和z元素来快速计算这些矩阵的逆矩阵。

如果您知道矩阵只包含旋转和平移,并且永远不包含比例,那么旋转矩阵就是上面的3x3元素。只要你的矩阵是同质的(即最后一列是[0 0 0 1]),你就可以读出最后一行的翻译:{{1​​}}应该是world.r[3]

如果您不熟悉DirectXMath,则应考虑在SimpleMath中使用DirectX Tool Kit包装器。它更自动地处理对齐复杂性,并包括像(x, y, z, 1)这样的方便帮助程序,它只提取等效的Matrix::Translation x,y和z。