我正在写一个涉及立方体的游戏。用户可以从他的角度旋转单个立方体,向左,向右,向上或向下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
当我在上面的每种情况下测试上下旋转时,它对于三个边是正确的,但在Right2情况下是错误的(颠倒)。也就是说,如果用户做了&#34; up&#34;旋转,在x旋转时变为-90deg,我认为这是正确的(x轴现在指向左侧),但是从用户的角度来看,它会使盒子向下转动。
我可以在上下旋转中找不到这样的简单问题:在任意数量的上下旋转之后,单个左右旋转按预期工作。
作为参考,我的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
我的轮换有什么问题?
答案 0 :(得分:0)
我找到了一种方法来完成这项工作。感觉有点笨拙,我仍然不明白为什么原来的方法不起作用。如果有人有更好的解决方案,我仍然全力以赴!
我就这样做了:
因此,例如,如果用户向右,向上,向右,向右,向下旋转形状,我们存储一个列表:
在绘图时,glRotatef以相反的顺序。
看起来效率低下,我觉得应该有更好的方法。我确定有。但它运作正常。