从左/右和上/下移动旋转和对象

Posted

技术标签:

【中文标题】从左/右和上/下移动旋转和对象【英文标题】:Rotating and object from left/right and up/down movements 【发布时间】:2015-02-04 10:09:19 【问题描述】:

我正在编写一个涉及立方体的游戏。用户可以从他的角度旋转单个立方体,向左、向右、向上或向下旋转 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 情况下是错误的(倒置)。也就是说,如果用户进行“向上”旋转,则在 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

我的轮换出了什么问题?

【问题讨论】:

【参考方案1】:

我找到了一种方法来完成这项工作。感觉有点笨拙,我还是不明白为什么原来的方法不起作用。如果有人有更好的解决方案,我仍然全神贯注!

我就是这样做的:

以自然方向显示形状。 每次用户旋转它时,将该旋转(使用场景轴)添加到旋转列表中。 (针对一个方向的多个移动进行优化。) 绘制时,以相反的顺序依次应用每个旋转。

例如,如果用户向右、向上、向右、向右、向下旋转形状,我们存储一个列表:

右 = 绕 Y 轴旋转 90 度 向上 = 绕 X 轴旋转 90 度 右,右 = 绕 Y 轴旋转 180 度 向下 = 绕 X 轴旋转 -90 度

在绘图时,glRotatef 这些以相反的顺序。

这似乎效率低下,我觉得应该有更好的方法。我确定有。不过效果很好。

【讨论】:

以上是关于从左/右和上/下移动旋转和对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在从左到右和从上到下排序的二维数组中搜索数字?

jquery切换从左到右和向后滑动

如何定位具有相同边距的 div 左、右和上

JavaFX - 如何在不扩大对象的命中框的情况下旋转可移动对象

如何为多个屏幕设置从左到右和反转的动画师

canvas和白鹭引擎中平移,旋转,缩放