我的OpenGL游戏中有一个墙模式DrawWall
和一架飞机DrawAirplane
。如何推送和弹出当前矩阵并仅翻译场景中的墙?
我希望飞机能够修好。
private: void DrawWall(){
glPushMatrix();
glBegin(GL_POLYGON);
LeftWallPattern();
glEnd();
glBegin(GL_POLYGON);
RightWallPattern();
glEnd();
glPopMatrix();
}
private: void DrawAirplane(){
glPushMatrix();
glBegin(GL_LINE_LOOP);
//...
glEnd();
glPopMatrix();
}
public: void Display(){
glClear(GL_COLOR_BUFFER_BIT);
glTranslatef(0, -0.02, 0);
DrawWall();
DrawAirplane();
glFlush();
}
答案 0 :(得分:2)
使用glPushMatrix()
推送当前矩阵,执行glTranslate
并绘制墙,然后glPopMatrix()
并绘制平面。这应该只翻译墙。问题是你似乎在显示中进行翻译,而不是在DrawWall
中进行翻译。
答案 1 :(得分:1)
要扩展耶稣所说的一些事情。
绘制飞机时,您不想对其应用任何变换,因此您需要加载单位矩阵:
Push the current modelview matrix
Load the identity matrix <=== this is the step you're missing
Draw the airplane
Pop the modelview matrix
在绘制墙时,您想要要应用当前的转换,因此不推送当前矩阵,否则您已删除了所有翻译我建立了。
Remove the Push/Pop operations from DrawWall()
在初始化的某个时刻,在第一次调用Display
之前,需要将模型视图矩阵设置为单位矩阵。对于Display
的每次后续调用,-0.02将在y方向添加到您的翻译中。