建立世界矩阵

时间:2011-01-02 16:22:49

标签: matrix directx c++11

当从比例,旋转,翻译矩阵构建世界投影矩阵时,翻译矩阵必须是过程中的最后一个,对吗?否则,您将缩放或旋转您的翻译。缩放和旋转需要按特定顺序进行吗?

现在我已经

std::for_each(objects.begin(), objects.end(), [&, this](D3D93DObject* ptr) {
    D3DXMATRIX WVP;
    D3DXMATRIX translation, rotationX, rotationY, rotationZ, scale;
    D3DXMatrixTranslation(&translation, ptr->position.x, ptr->position.y, ptr->position.z);
    D3DXMatrixRotationX(&rotationX, ptr->rotation.x);
    D3DXMatrixRotationY(&rotationY, ptr->rotation.y);
    D3DXMatrixRotationZ(&rotationZ, ptr->rotation.z);
    D3DXMatrixScaling(&translation, ptr->scale.x, ptr->scale.y, ptr->scale.z);
    WVP = rotationX * rotationY * rotationZ * scale * translation * ViewProjectionMatrix;
});

1 个答案:

答案 0 :(得分:2)

你认为订单很重要是正确的。矩阵乘法不是可交换的。

至于具体问题。如果您正在进行非均匀缩放,那么应用转换的顺序肯定很重要。您可能希望首先进行缩放,因为缩放的坐标仍然是原始的本地坐标系。如果要使树更高但不更宽,则可以缩放Y坐标。如果你想在山坡上有一棵高大的树木,你可以根据需要旋转它。

另一方面,缩放可能是其他一些互动的结果。角色被困在一个移动的天花板下,它正在压扁他。在这种情况下,角色需要旋转到位,然后向下缩放。

最终,这意味着您需要按照它们发生的顺序应用转换。将对象缩放到所需的形状,然后根据需要进行所需的转换以将它们放入世界中。根据您的确切需要在中间添加任何额外的步骤。