所以我在显示屏上有以下电话。 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版本在整个商店旋转和翻译而不是我期望的地方 - 认为之前的旋转和翻译正在影响最近的讨论,即使我有每个方块都被推/弹矩阵括起来
答案 0 :(得分:0)
在最近3天绞尽脑汁之后。突然间,灯光恍然大悟 - 旋转然后平移的顺序让我头晕目眩。我忘了旋转意味着坐标系已经旋转,所以在这一点之后,当参考框架旋转时使用绝对坐标意味着各种意想不到的结果 - 给出了我不正确的假设。
有点尴尬但很高兴终于明白了。