0

マトリックスの生成方法がわかりません。

その写真がそれを説明していることを願っていますが、基本的には初期位置があり、メイン ジョイントを 90 度回転させ、それに続いて最後のジョイントを 90 度回転させようとしています。その後、変換を適用して最終的な行列を取得します (コードを参照)。これは、ジョイントに関連する一連のポイントに適用されます。

最後の回転が機能していないようです。次の行を入れなくても問題ありません。(足はまっすぐ下です)。明らかな何かが欠けているに違いありませんか?回転のためにこの方法で行列乗算を行うことはできませんか?

ここに画像の説明を入力

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

1 に答える 1

0

要件には、主に 2 つの手順があります。

  1. ジョイント 0、1、2 を原点を中心に 90 度回転します。
  2. ジョイント 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;
}
于 2014-03-24T02:32:02.297 に答える