私は立方体を含むゲームを書いています。ユーザーは、個々の立方体を自分の視点から、左、右、上、または下に 90 度回転させることができます。
当然、形状を回転すると、その軸の位置が変化するため、次の回転は別の軸を中心に行われる可能性があります。たとえば、最初の回転が「右」の場合、Y (垂直) 軸を中心に正の方向に回転する必要があります。ここで、Z 軸は X 軸があった場所であり、X 軸は Z 軸があった場所ですが、反対方向を指しています。
これを行うには、マトリックスを使用します。
// The matrix used to rotate/tip the shape. This is updated each time we rotate.
private int m_rotationMatrix[][] = { {0, 1, 0}, // User wants to rotate left-right
{1, 0, 0} }; // User wants to rotate up-down
ローテーションごとに更新します。
// If we rotated in the x direction, we need to put the z axis where the x axis was
if (0 != leftRight)
{
int newXMatrix[][] = new int[2][3];
for (int direction=0 ; direction<2 ; ++direction)
{
newXMatrix[direction][X_DIMENSION] = m_rotationMatrix[direction][Z_DIMENSION] * (-leftRight);
newXMatrix[direction][Y_DIMENSION] = m_rotationMatrix[direction][Y_DIMENSION]; // Unchanged
newXMatrix[direction][Z_DIMENSION] = m_rotationMatrix[direction][X_DIMENSION] * (leftRight);
}
m_rotationMatrix = newXMatrix;
}
// If we rotated in the y direction, we need to put the z axis where the y axis was
if (0 != upDown)
{
int newXMatrix[][] = new int[2][3];
for (int direction=0 ; direction<2 ; ++direction)
{
newXMatrix[direction][X_DIMENSION] = m_rotationMatrix[direction][X_DIMENSION]; // Unchanged
newXMatrix[direction][Y_DIMENSION] = m_rotationMatrix[direction][Z_DIMENSION] * (upDown);
newXMatrix[direction][Z_DIMENSION] = m_rotationMatrix[direction][Y_DIMENSION] * (-upDown);
}
m_rotationMatrix = newXMatrix;
}
ここで、形状を右、右、右に回転すると、結果の行列は、本来あるべきだと思うとおりになります。
x y z
Start: LeftRight 0 1 0
UpDown 1 0 0
Right1: LeftRight 0 1 0
UpDown 0 0 1
Right2: LeftRight 0 1 0
UpDown -1 0 0 <-- Looks right to me but doesn't work!
Right3: LeftRight 0 1 0
UpDown 0 0 -1
上記の各ケースで上下回転をテストすると、3 面は正しいのですが、Right2 の場合は間違っています (上下が逆になっています)。つまり、ユーザーが「上」回転を行うと、x 回転で -90 度になりますが、これは正しいと思います (x 軸は現在左を向いています)。視点、下向き。
上下の回転には、そのような単純な問題は見当たりません。上下の回転を何回か行った後、1 回の左右の回転が期待どおりに機能します。
参考までに、私の draw() はこれを行います:
// Set drawing preferences
gl.glFrontFace(GL10.GL_CW);
// Set this object's rotation and position
gl.glPushMatrix();
gl.glTranslatef(m_xPosition, m_yPosition, m_zPosition - m_selectZ);
gl.glRotatef(m_xRotation, 1, 0, 0);
gl.glRotatef(m_yRotation, 0, 1, 0);
gl.glRotatef(m_zRotation, 0, 0, 1);
...blah blah
私の回転が間違っているのは何ですか?