0

私は立方体を含むゲームを書いています。ユーザーは、個々の立方体を自分の視点から、左、右、上、または下に 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

私の回転が間違っているのは何ですか?

4

1 に答える 1

0

これを機能させる方法を見つけました。少しぎこちなく感じますが、元の方法がうまくいかなかった理由はまだわかりません。誰かがより良い解決策を持っている場合でも、私はまだすべて耳を傾けています!

これが私がやった方法です:

  • シェイプを自然な向きで表示します。
  • ユーザーが回転するたびに、その回転を (シーン軸を使用して) 回転のリストに追加します。(一方向の複数の動きに最適です。)
  • 描画するときは、逆の順序で各回転を順番に適用します。

たとえば、ユーザーが形状を右、上、右、右、下に回転させると、リストが保存されます。

  • 右 = Y 軸を中心に 90 度回転
  • 上 = X 軸を中心に 90 度回転
  • 右、右 = Y 軸を中心に 180 度回転
  • 下 = X 軸を中心に -90 度回転

描画では、これらを逆順に glRotatef します。

それは非効率に思えますし、もっと良い方法があるべきだと思います。きっとあるよ。ただし、正常に動作します。

于 2015-02-07T10:02:18.170 に答える