[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;
編集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;
数学的には、これは私には聞こえます。ここからどこへ行くべきかわからない。
フレデリコが提案したように、行列のみを使用して実装しようと思います。