Matrix 构建世界矩阵

Matrix 构建世界矩阵,matrix,directx,c++11,Matrix,Directx,C++11,当从缩放、旋转、平移矩阵构建世界投影矩阵时,平移矩阵必须是该过程中的最后一个矩阵,对吗?否则,您将缩放或旋转您的翻译。缩放和旋转是否需要按特定顺序进行 现在我有 std::for_each(objects.begin(), objects.end(), [&, this](D3D93DObject* ptr) { D3DXMATRIX WVP; D3DXMATRIX translation, rotationX, rotationY, rotationZ, scale;

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

现在我有

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;
});

你认为顺序很重要是对的。矩阵乘法不是可交换的

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

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


最终,这意味着您需要按照转换发生的顺序应用转换。将对象缩放为所需的形状,然后根据需要进行必要的变换以将其放置到世界中。根据你的实际需要在中间添加任何额外的步骤。

所得到的对象出现在空间中,并且实际上只与自身相对。