如何在OpenGL中只翻译场景中的一个对象?

时间:2013-06-18 21:53:45

标签: c++ opengl translate

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

2 个答案:

答案 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方向添加到您的翻译中。