Jogl Push / Pop Matrix不工作或我误解了

时间:2014-12-30 04:31:31

标签: jogl

所以我在显示屏上有以下电话。 display方法没有调用除loadIdentity之外的任何状态更改方法。然后显示方法调用以下内容。

    gl.glPushMatrix();
    gl.glRotated(m_angle, 1.0, 1.0, 0.0);
    m_angle += 5;
    cubeBySquare(gl,0.2);
    gl.glTranslated( 0.5,  0.0 ,  0.0 );
    cubeByVertex(gl,0.2);
    gl.glPopMatrix();

下面显示了两种方法 - 基本上一种尝试使用旋转和平移(cubeBySquare)绘制立方体,另一种尝试通过明确指定所有顶点(cubeByVertex)来成功绘制立方体。

protected   void                cubeBySquare(GL2 gl,double side)
{
    /*
     *  front - blue
     *  
     *  draw the square and leave it where it is on XY plane
     */
    gl.glPushMatrix();
    gl.glColor3d(0.0,0.0,1.0);
    square(gl,side);
    gl.glPopMatrix();

    /*
     *  back - green
     *  
     *  draw square and push it backwards on the Z axis
     */
    gl.glPushMatrix();
    gl.glColor3d(0.0,1.0,0.0);
    gl.glTranslated( 0.0 ,  0.0 , -side);
    square(gl,side);
    gl.glPopMatrix();

    /*
     *  lhs - cyan
     *  
     *  draw square and rotate -90 around Y axis
     */
    gl.glPushMatrix();
    gl.glColor3d(0.0,1.0,1.0);
    gl.glRotated(-90, 0.0, 1.0, 0.0);
    square(gl,side);
    gl.glPopMatrix();

    /*
     *  rhs - red
     *  
     *  draw square, rotate -90 aeound Y axis, translate to rhs on X axis
     */
    gl.glPushMatrix();
    gl.glColor3d(1.0,0.0,0.0);
    gl.glRotated(-90, 0.0, 1.0, 0.0);
    gl.glTranslated( side,  0.0 ,  0.0 );
    square(gl,side);
    gl.glPopMatrix();

    /*
     *  top - mauve
     *  
     *  draw square, rotate -90 around X axis, translate along Y axis
     */
    gl.glPushMatrix();
    gl.glColor3d(1.0,0.0,1.0);
    gl.glRotated( 90, 1.0, 0.0, 0.0);
    gl.glTranslated( 0.0 ,  side ,  0.0 );
    square(gl,side);
    gl.glPopMatrix();

    /*
     *  bottom - yellow
     *  
     *  draw square, rotate -90 around X-axis
     */
    gl.glPushMatrix();
    gl.glColor3d(1.0,1.0,0.0);
    gl.glRotated(-90, 1.0, 0.0, 0.0);
    square(gl,side);
    gl.glPopMatrix();
}

protected   void                cubeByVertex(GL2 gl,double side)
{
    gl.glBegin(GL_QUADS); // of the color cube

    // Front - blue
    gl.glColor3d(0.0, 0.0, 1.0);
    gl.glVertex3d( 0.0 ,  0.0 ,  0.0 );
    gl.glVertex3d( side,  0.0 ,  0.0 );
    gl.glVertex3d( side,  side,  0.0 );
    gl.glVertex3d( 0.0 ,  side,  0.0 );

    // Back - green
    gl.glColor3d(0.0, 1.0, 0.0);
    gl.glVertex3d( 0.0 ,  0.0 , -side);
    gl.glVertex3d( side,  0.0 , -side);
    gl.glVertex3d( side,  side, -side);
    gl.glVertex3d( 0.0 ,  side, -side);

    // Left - cyan
    gl.glColor3d(0.0, 1.0, 1.0);
    gl.glVertex3d( 0.0 ,  0.0 ,  0.0 );
    gl.glVertex3d( 0.0 ,  0.0 , -side);
    gl.glVertex3d( 0.0 ,  side, -side);
    gl.glVertex3d( 0.0 ,  side,  0.0 );

    // Right - red
    gl.glColor3d(1.0, 0.0, 0.0);
    gl.glVertex3d( side,  0.0 ,  0.0 );
    gl.glVertex3d( side,  0.0 , -side);
    gl.glVertex3d( side,  side, -side);
    gl.glVertex3d( side,  side,  0.0 );

    // Top - mauve 
    gl.glColor3d(1.0, 0.0, 1.0);
    gl.glVertex3d( 0.0 ,  side,  0.0 );
    gl.glVertex3d( side,  side,  0.0 );
    gl.glVertex3d( side,  side, -side);
    gl.glVertex3d( 0.0 ,  side, -side);

    // Bottom - yellow
    gl.glColor3d(1.0, 1.0, 0.0);
    gl.glVertex3d( 0.0 ,  0.0 ,  0.0 );
    gl.glVertex3d( side,  0.0 ,  0.0 );
    gl.glVertex3d( side,  0.0 , -side);
    gl.glVertex3d( 0.0 ,  0.0 , -side);

    gl.glEnd(); // of the color cube
}

结果是意外的,如图中所示。我试图看看我的逻辑错在哪里,但我找不到任何意外的事情。在我看来,推/弹矩阵并没有真正从堆栈中清除矩阵。这可能意味着我没有正确使用它 - 但它看起来像我在网上找到的大多数分层绘图的例子。

似乎没有办法在这里包含图片,这使得解释变得笨拙。

基本上thr cubeBySquare版本在整个商店旋转和翻译而不是我期望的地方 - 认为之前的旋转和翻译正在影响最近的讨论,即使我有每个方块都被推/弹矩阵括起来

1 个答案:

答案 0 :(得分:0)

在最近3天绞尽脑汁之后。突然间,灯光恍然大悟 - 旋转然后平移的顺序让我头晕目眩。我忘了旋转意味着坐标系已经旋转,所以在这一点之后,当参考框架旋转时使用绝对坐标意味着各种意想不到的结果 - 给出了我不正确的假设。

有点尴尬但很高兴终于明白了。