0

[C++] {DirectX 9}

TL;DR: マトリックスを使用して、X 軸のローカル回転を表す浮動小数点数をグローバル ヨー/ピッチ/ロールに変換するにはどうすればよいですか?

そこで、プレイヤーが斧のメッシュとして表現される小さなゲームを書いています。プレイヤーのビューは、マウスの動きに合わせて (Y 軸を中心に) 水平方向に回転します。[ここ]は、より良いアイデアを得るためのスクリーンショットです。

そこで、マウスを押したまま斧を前後に振るアニメーションを作成しようとしています。現時点では、プレーヤー クラス内のプレーヤーのグローバル位置と回転を変数 (m_x、m_y、m_z、m_rotationX、m_rotationY、m_rotationZ) として格納しています。

オブジェクトを描画するとき、これらすべての座標をグローバル空間に変換して、ワールド マトリックスを作成します。ええ、これらはグローバル座標です。m_rotationY は、マウスの動きに基づいて変更されます。

これが意味することは、m_rotationX をインクリメントすると (つまり、何らかのアニメーション インクリメントの sin 値によって)、オブジェクトがグローバルに回転するということです。

私の質問:「ローカル」x 回転値を「グローバル」x、y、および z 回転値に変換するには、どのような行列変換を行う必要がありますか。

if(m_attacking)
{
    m_attackAnimation += 0.1f;
    float rotationAmount = sin(m_attackAnimation) * 0.1;

    // How do I figure out m_rotationX, m_rotationY and m_rotationZ 
    // from rotationAmount here? :c
}

これまでの私の考えでは、X Rotation Matrix を作成し、それを使用してある種のベクトルを変換することでしたが、それに関する私の実験はすべてうまくいきませんでした。

お時間をいただきありがとうございます:D

編集:

もっと図を!

やるとこうなるm_rotationX = rotationAmount;

http://imgur.com/a/yZqzx

編集2:

したがって、フェデリコの答えに基づいて、次のコードを設定しました。

// Get the local "right" vector
D3DXVECTOR3 right(1, 0, 0);
D3DXMATRIX rotationY;
D3DXMatrixRotationY(&rotationY, m_rotationY);
D3DXVec3TransformCoord(&right, &right, &rotationY);

// Calculate the theta value we want to rotate by
m_attackAnimation += 0.1f;
float rotationAmount = sin(m_attackAnimation) * 0.1;

//Cross product
D3DXVECTOR3 axis;
D3DXVECTOR3 up(0, 1, 0);
D3DXVec3Cross(&axis, &right, &up);

//Rotation matrix
D3DXMATRIX matrix;
D3DXMatrixRotationAxis(&matrix, &axis, rotationAmount);

これは、X 軸のローカル回転を表す回転行列を提供する必要があります。しかし、私はおそらくそれを完全に間違っています。

とにかく、これをグローバルなrotationX、rotationY、およびrotationZフロートに戻すにはどうすればよいですか

*編集 3: *

これは、マトリックスから回転角度を抽出する私の試みです。残念ながら、結果は完全にオフです。斧が見えなくなり、キャラクターがランダムに動き回ります。

    float rotY = acosf(matrix._11);
float rotX = asinf(matrix._13 / sin(rotY));
float rotZ = acosf(matrix._21 / sin(rotX));

m_rotationX += rotX;
m_rotationY += rotY;
m_rotationZ += rotZ;

数学的には、これは私には聞こえます。ここからどこへ行くべきかわからない。

フレデリコが提案したように、行列のみを使用して実装しようと思います。

4

1 に答える 1

0

あなたがやろうとしていることを理解していれば、これは任意の軸を中心に回転するマトリックスを作成します.あなたの場合、軸は方向とアップベクトルの間の外積です. 、座標系と製品の順序によって異なります)。外積は、常に他の 2 つに垂直なベクトルを返します。

//Cross product
D3DXVECTOR3 axis;
D3DXVec3Cross(&axis, &direction, &up);

//Rotation matrix
D3DXMATRIX matrix;
D3DXMatrixRotationAxis(&matrix, &axis, rotationAmount);

結果の行列は、回転行列になるはずです。

回転角度を元に戻したい場合は、「回転行列 XYZ」セクションのhttp://en.wikipedia.org/wiki/Euler_anglesを参照してください。 directx を使用して、位置と回転を保存します。

これにより、行列を使用して位置と方向を簡単に回転、変換、スケーリングすることができます。すべての操作で数学を気にする必要はなく、ギマブル ロック ( http://en.wikipedia.org/wiki/Gimbal_lock ) を引き起こすこともありません。http://msdn.microsoft.com/en-us/library/windows/desktop/bb205164(v=vs.85).aspxを参照して、 directxの数学操作を確認するか、他のチュートリアルを検索してください。習得は非常に簡単です。それらを処理する方法。

特定の数学またはその他のゲーム関連のトピックに関する情報が必要な場合は、Jason Gregory による「ゲーム エンジン アーキテクチャ」を読むことをお勧めします。

于 2013-10-28T14:29:44.030 に答える