DirectX 9旋转"关节"

时间:2014-03-23 21:58:56

标签: animation 3d directx directx-9 revolute-joints

我无法弄清楚如何生成矩阵。

希望这张图解释了它,但基本上我有一个初始位置,我试图将主关节旋转90度,然后跟着它,将最后一个关节旋转90度。之后我会应用翻译来获得最终矩阵(参见代码)。这适用于一组与其关节相关的点。

最后一次旋转似乎不起作用,如果我不放入该行就可以了:matrixPositions [2] .appliedRotationMatrix * =(matrixRotX * matrixRotY * matrixRotZ); (腿是直的)。我一定错过了一些明显的东西?你不能用这种方式进行矩阵乘法旋转吗?

enter image description here

D3DXMATRIX matrixRotX, matrixRotY, matrixRotZ;
D3DXMatrixRotationX(&matrixRotX, 0);
D3DXMatrixRotationY(&matrixRotY, 0);
D3DXMatrixRotationZ(&matrixRotZ, -PI/2);

matrixPositions[0].appliedRotationMatrix *= (matrixRotX * matrixRotY * matrixRotZ);

D3DXMATRIX matTranslationIn1;
D3DXMatrixTranslation(&matTranslationIn1, (matrixPositions[0].position.x-matrixPositions[1].position.x), (matrixPositions[0].position.y-matrixPositions[1].position.y), (matrixPositions[0].position.z-matrixPositions[1].position.z));

D3DXMATRIX matTranslationOut1;
D3DXMatrixTranslation(&matTranslationOut1, -(matrixPositions[0].position.x-matrixPositions[1].position.x), -(matrixPositions[0].position.y-matrixPositions[1].position.y), -(matrixPositions[0].position.z-matrixPositions[1].position.z));

matrixPositions[1].appliedRotationMatrix *= (matTranslationIn1 * (matrixRotX * matrixRotY * matrixRotZ) * matTranslationOut1);

D3DXMatrixTranslation(&matTranslationIn1, (matrixPositions[0].position.x-matrixPositions[2].position.x), (matrixPositions[0].position.y-matrixPositions[2].position.y), (matrixPositions[0].position.z-matrixPositions[2].position.z));

D3DXMatrixTranslation(&matTranslationOut1, -(matrixPositions[0].position.x-matrixPositions[2].position.x), -(matrixPositions[0].position.y-matrixPositions[2].position.y), -(matrixPositions[0].position.z-matrixPositions[2].position.z));

matrixPositions[2].appliedRotationMatrix *= (matTranslationIn1 * (matrixRotX * matrixRotY * matrixRotZ) * matTranslationOut1);
matrixPositions[2].appliedRotationMatrix *= (matrixRotX * matrixRotY * matrixRotZ);



D3DXMATRIX matrix[3];
for (int x = 0; x < 3; x++)
{
    D3DXMatrixIdentity( &matrix[x]);

    D3DXMATRIX matTranslation;
    D3DXMatrixTranslation(&matTranslation, matrixPositions[x].position.x, matrixPositions[x].position.y, matrixPositions[x].position.z);

    matrix[x] = matrix[x] * matrixPositions[x].appliedRotationMatrix * matTranslation;
}

1 个答案:

答案 0 :(得分:0)

您的要求有两个主要步骤。

  1. 将原点周围的关节0,1和2旋转90度。
  2. 将关节1绕关节1旋转90度。
  3. 我写了一些伪代码,差不多完成了,但是你仍然需要一些更新才能使用它。请参阅代码中的注释以获取详细信息。

    void Rotatation()
    {
        // Build up the rotation matrix for step 1
        D3DXVECTOR3 rotAxis(0, 0, 1); 
        float angle = -(D3DX_PI / 2);
        D3DXMATRIX rotMatrix;
        D3DXMatrixRotationAxis(&rotMatrix, &rotAxis, angle);
    
        // rotate joints 0, 1 and 2 by apply the matrix above
        for (int i = 0; i < 3; i++)
        {
            joints[i].matrix *= rotMatrix;
        }
    
        // Build up the rotation matrix for joint 2
        // Since joint 2 was not rotate around the origin(I mean the axis should pass the origin), so first you need to translate the rotation center to origin
        // then rotate joint 2, and last move back
    
        // After the rotation in step 1, joint 1 now locate at (0, 2, 0)
        // to translate it to the origin.
        D3DXMATRIX transMat;
        D3DXMatrixTranslation(&transMat, 0, 2, 0);
    
        // Now joint 2 can rotate around z-axis, so the rotate matrix is same as step 1
    
        // after rotation, move back, this matrix is the inverse of transMat
        D3DXMATRIX inverseTransMat;
        D3DXMatrixTranslation(&transMat, 0, -2, 0);
    
        // Combine the 3 matrix above
        D3DXMATRIX rotMatjoin2 = transMat * rotMatjoin2 * inverseTransMat;
    
        // rotate jonit 2
        joints[2].matrix *= rotMatjoin2;
    }