Animation DirectX 9围绕“旋转”;“关节”;

Animation DirectX 9围绕“旋转”;“关节”;,animation,3d,directx,directx-9,revolute-joints,Animation,3d,Directx,Directx 9,Revolute Joints,我搞不清楚如何生成矩阵 希望这张图片能解释这一点,但基本上我有一个初始位置,我试着将主关节旋转90度,然后,将最后一个关节旋转90度。然后,我随后应用翻译来获得最终的矩阵(参见代码)。应用于相对于其关节的一组点 最后一个旋转似乎不起作用,如果我不把它放在行中就可以了:matrixPositions[2]。appliedRotationMatrix*=(matrixRotX*matrixRotY*matrixRotZ);(腿是直的)。我一定错过了什么明显的东西?你们不能用这种方法做旋转矩阵乘法吗

我搞不清楚如何生成矩阵

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

最后一个旋转似乎不起作用,如果我不把它放在行中就可以了:matrixPositions[2]。appliedRotationMatrix*=(matrixRotX*matrixRotY*matrixRotZ);(腿是直的)。我一定错过了什么明显的东西?你们不能用这种方法做旋转矩阵乘法吗

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

d3dx矩阵矩阵rotx,矩阵roty,矩阵rotz;
D3DXMatrixRotationX(&matrixRotX,0);
D3DXMatrixRotationY(&MatrixRotaty,0);
d3dx矩阵旋转z(&matrixRotZ,-PI/2);
matrixPositions[0].appliedRotationMatrix*=(matrixRotX*matrixRotY*matrixRotZ);
D3DX矩阵MattTranslationn1;
D3DXMatrixTranslation(&MattTranslationIn1,(matrixPositions[0]。position.x-matrixPositions[1]。position.x,(matrixPositions[0]。position.x),(matrixPositions[0]。position.z-matrixPositions[1]。position.z));
D3DX矩阵MattTranslationOut1;
D3DXMatrixTranslation(&MattTranslationOut1,-(matrixPositions[0]。position.x-matrixPositions[1]。position.x),-(matrixPositions[0]。position.y-matrixPositions[1]。position.y),-(matrixPositions[0]。position.z-matrixPositions[1]。position.z));
矩阵位置[1]。应用矩阵*=(MattTranslationn1*(matrixRotX*matrixRotY*matrixRotZ)*MattTranslationOut1);
D3DXMatrixTranslation(&MattTranslationN1,(matrixPositions[0]。position.x-matrixPositions[2]。position.x,(matrixPositions[0]。position.x),(matrixPositions[0]。position.z-matrixPositions[2]。position.z));
D3DXMatrixTranslation(&MattTranslationOut1,-(matrixPositions[0]。position.x-matrixPositions[2]。position.x),-(matrixPositions[0]。position.y-matrixPositions[2]。position.y),-(matrixPositions[0]。position.z-matrixPositions[2]。position.z));
矩阵位置[2]。应用矩阵*=(MattTranslationN1*(matrixRotX*matrixRotY*matrixRotZ)*MattTranslationOut1);
matrixPositions[2]。appliedRotationMatrix*=(matrixRotX*matrixRotY*matrixRotZ);
d3dx矩阵[3];
对于(int x=0;x<3;x++)
{
D3DXMatrixIdentity(&matrix[x]);
D3DX矩阵转换;
D3DXMatrixTranslation(&MattTranslation,matrixPositions[x]。位置.x,matrixPositions[x]。位置.y,matrixPositions[x]。位置.z);
矩阵[x]=矩阵[x]*矩阵位置[x].应用动态矩阵*MattTranslation;
}

您的需求有两个主要步骤

  • 将关节0、1和2绕原点旋转90度
  • 将接头2绕接头1旋转90度
  • 我写了一些伪代码,它几乎完成了,但你仍然需要一些更新来使用它。有关详细信息,请参见代码中的注释

    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;
    }
    
    void旋转()
    {
    //建立步骤1的旋转矩阵
    D3DXVECTOR3旋转轴(0,0,1);
    浮动角度=-(D3DX_PI/2);
    d3dx矩阵;
    D3dx矩阵旋转轴(旋转矩阵和旋转轴,角度);
    //通过应用上述矩阵旋转关节0、1和2
    对于(int i=0;i<3;i++)
    {
    接头[i]。矩阵*=旋转矩阵;
    }
    //建立关节2的旋转矩阵
    //因为关节2没有绕原点旋转(我的意思是轴应该经过原点),所以首先需要将旋转中心平移到原点
    //然后旋转关节2,最后向后移动
    //在步骤1中旋转后,关节1现在位于(0,2,0)
    //把它翻译成原点。
    d3dx矩阵变换;
    D3DX矩阵翻译(&transMat,0,2,0);
    //现在,关节2可以绕z轴旋转,因此旋转矩阵与步骤1相同
    //旋转后,向后移动,此矩阵是transMat的逆矩阵
    d3dx矩阵逆变换;
    d3dx矩阵翻译(&transMat,0,-2,0);
    //结合上面的3个矩阵
    D3DXMATRIX rotMatjoin2=transMat*rotMatjoin2*反向transMat;
    //旋转jonit 2
    接头[2]。矩阵*=rotMatjoin2;
    }
    
    您最好在代码中添加一些注释。我正在查看您所做的操作,所以rotationaxis使所有零件围绕原点旋转?另外,我只是想确保我理解,如果你将第0部分旋转90度,然后将第1部分旋转90度,然后将第2部分旋转90度,会有什么变化(比问题多了一个关节运动)?我的也在这里崩溃了。@MaryEllenBench图片中有4个点,其中3个点标有数字(0、1和2),没有数字的点是origin@MaryEllenBench我的意思是,同时将0、1和2绕原点旋转90度,然后将2绕1旋转90度。是的,我想进一步提高一级(然后旋转0乘90,然后旋转1乘90,然后旋转2乘90),作为后续。比如,你能将mo,re乘以多个rotMatJoin吗?@MaryEllenBench是的,你能,只要你建立了正确的旋转轴和角度。