我昨天才开始使用OpenGL和C ++,所以我可能只是错过了一些东西,但在我看来,代码应该以完全相同的方式运行。< / p>
我有一些嵌套的glPush/PopMatrix()
功能,我用这些功能将一些气缸设置为皮克斯灯的基本版本。我想做的是旋转然后围绕它们顶部的圆柱点旋转,但这似乎只发生在底部圆柱体和顶部圆柱体上,更高,它们似乎只是移动关于不同的轴。
我认为我没有正确解释,所以我在代码下面添加了一些图片。
glPushMatrix();
glTranslatef(g_translate_x, g_translate_y, 0.0);
glRotatef(g_dof3_angle, 1, 0, 0);
//base cylinder
glPushMatrix();
draw_bigcylinder(0, 0, 0);
glRotatef(g_dof4_angle, 0.0, 0.0, 1.0);
//body cylinder
glPushMatrix();
draw_cylinder(0, 0, 90);
glRotatef(g_dof5_angle, 0.0, 0.0, 1.0);
//neck cylinder
glPushMatrix();
draw_cylinder(0, 9, 45);
glRotatef(g_dof6_angle+90, 0, 1.0, 0);
glTranslatef(0, 16, 4);
glPushMatrix();
gluCylinder(qobj, 2, 4, 7, 16, 16);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
编辑:这是draw_cylinder()
功能:
void draw_cylinder(float translate_x,float translate_y,float dof3_angle){
GLUquadricObj * qobj = gluNewQuadric();
glPushMatrix();
glTranslatef(translate_x, translate_y, 0.0);
glRotatef(dof3_angle, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(90, 0.0, 1.0, 0.0);
gluCylinder(qobj, 1.0, 1.0, 10.0, 16, 16);
gluQuadricOrientation(qobj, GLU_INSIDE);
gluDisk(qobj, 0.0, 1.0, 16, 16);
glTranslatef(0.0, 0.0, 10.0);
gluQuadricOrientation(qobj, GLU_OUTSIDE);
glPopMatrix();
glPopMatrix();
}
答案 0 :(得分:1)
您需要将参考框架转换为第二个圆柱体的顶部。
为此,在您创建第二个气缸后,执行pushMatrix
,然后在该参考系中再次转换为气缸中心(由第三个气缸的半长度平移)。再次在那里创建圆柱并执行popMatrix
。现在,您将转到您想要旋转第三个圆柱体的原始参照系。将旋转功能放在此推/弹块上。