0

我的 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();
}
4

2 回答 2

2

用来glPushMatrix()推当前矩阵,做glTranslate画墙,然后glPopMatrix()画平面。这应该只平移墙。问题是您似乎是在显示中进行翻译,而不是在DrawWall应有的位置进行翻译。

于 2013-06-18T21:55:27.290 回答
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 方向的翻译中。

于 2013-06-19T14:44:10.807 回答