如果我所知道的只是一个物体的世界矩阵(因为它的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)
如果这是正确/最好的方式,请告诉我!
有点切向,正如你所看到的那样,我使用平移的反转来“将它移回”原来的位置,然后我将其转换为旋转原点。很多样本都跳过了这个 - 有没有我缺少的东西,你不需要 - 最后翻译回去?
答案 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。