left/right 和 up/down 运动的旋转和对象
Rotating and object from left/right and up/down movements
我正在编写一个涉及立方体的游戏。用户可以从他的角度向左、向右、向上或向下旋转 90 度。
自然地,当形状旋转时,其轴的位置会发生变化,因此下一次旋转可能围绕不同的轴。比如第一个旋转是"right",我需要绕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 案例中是错误的(颠倒的)。也就是说,如果用户进行 "up" 旋转,则在 x 轴旋转时变为 -90 度,我认为这是正确的(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
我的旋转有什么问题?
我找到了一种方法来完成这项工作。感觉有点笨拙,一直不明白为什么原来的方法不行。如果有人有更好的解决方案,我仍然洗耳恭听!
我是这样做的:
- 以自然方向显示形状。
- 每次用户旋转它时,将该旋转(使用场景轴)添加到旋转列表中。 (针对一个方向的多个运动进行优化。)
- 绘制时,按相反顺序依次应用每个旋转。
例如,如果用户向右、向上、向右、向右、向下旋转形状,我们将存储一个列表:
- 右=绕Y轴旋转90度
- 向上=绕X轴旋转90度
- 右,右 = 绕 Y 轴旋转 180 度
- 向下=绕X轴旋转-90度
在绘制时,glRotatef 以相反的顺序进行旋转。
感觉效率不高,感觉应该有更好的办法。我确定有。但是它工作正常。
我正在编写一个涉及立方体的游戏。用户可以从他的角度向左、向右、向上或向下旋转 90 度。
自然地,当形状旋转时,其轴的位置会发生变化,因此下一次旋转可能围绕不同的轴。比如第一个旋转是"right",我需要绕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 案例中是错误的(颠倒的)。也就是说,如果用户进行 "up" 旋转,则在 x 轴旋转时变为 -90 度,我认为这是正确的(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
我的旋转有什么问题?
我找到了一种方法来完成这项工作。感觉有点笨拙,一直不明白为什么原来的方法不行。如果有人有更好的解决方案,我仍然洗耳恭听!
我是这样做的:
- 以自然方向显示形状。
- 每次用户旋转它时,将该旋转(使用场景轴)添加到旋转列表中。 (针对一个方向的多个运动进行优化。)
- 绘制时,按相反顺序依次应用每个旋转。
例如,如果用户向右、向上、向右、向右、向下旋转形状,我们将存储一个列表:
- 右=绕Y轴旋转90度
- 向上=绕X轴旋转90度
- 右,右 = 绕 Y 轴旋转 180 度
- 向下=绕X轴旋转-90度
在绘制时,glRotatef 以相反的顺序进行旋转。
感觉效率不高,感觉应该有更好的办法。我确定有。但是它工作正常。