C++ 如何在OpenGL中仅转换场景的一个对象?

C++ 如何在OpenGL中仅转换场景的一个对象?,c++,opengl,translate,C++,Opengl,Translate,在我的OpenGL游戏中,我有一个墙模式DrawWall和一架飞机drawplanet。如何推动和弹出当前矩阵并仅平移场景中的墙 我希望飞机能修好 private: void DrawWall(){ glPushMatrix(); glBegin(GL_POLYGON); LeftWallPattern(); glEnd(); glBegin(GL_POLYGON); RightWallPattern(); glEnd(); g

在我的OpenGL游戏中,我有一个墙模式
DrawWall
和一架飞机
drawplanet
。如何推动和弹出当前矩阵并仅平移场景中的墙

我希望飞机能修好

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

使用
glPushMatrix()
推动当前矩阵,执行
glTranslate
并绘制墙,然后
glPopMatrix()
并绘制平面。这只能平移墙。问题是您似乎是在显示中而不是在
DrawWall
中执行平移操作。

使用
glPushMatrix()
推动当前矩阵,执行
glTranslate
并绘制墙,然后
glPopMatrix()
并绘制平面。这只能平移墙。问题是你似乎是在显示器上做翻译,而不是在
DrawWall
应该在的地方做翻译。

有几件事可以详述耶稣所说的话

绘制飞机时,您不希望对其应用任何变换,因此需要加载标识矩阵:

Push the current modelview matrix
Load the identity matrix <=== this is the step you're missing
Draw the airplane
Pop the modelview matrix

在初始化过程中的某个时刻,在第一次调用
Display
之前,需要将modelview矩阵设置为标识矩阵。对于以后每次调用
Display
,-0.02将被添加到y方向的翻译中。

一些事情来扩展耶稣所说的内容

绘制飞机时,您不希望对其应用任何变换,因此需要加载标识矩阵:

Push the current modelview matrix
Load the identity matrix <=== this is the step you're missing
Draw the airplane
Pop the modelview matrix

在初始化过程中的某个时刻,在第一次调用
Display
之前,需要将modelview矩阵设置为标识矩阵。对于以后每次调用
显示
,-0.02将添加到y方向的翻译中。

我已更改,但不影响!来源如下:@Hallaji我看不出该代码有任何错误(乍一看)。您是否曾调用
glLoadIdentity()
以确保在绘图之前加载了标识矩阵?不,我没有在任何地方调用
glLoadIdentity()
:(哦,问题出在哪里?:(@Hallaji是的,你应该始终以身份矩阵作为当前矩阵开始。谢谢你的回复。你能解释一下我应该在哪里添加
glLoadIdentity()
?我做了更改,但没有影响!以下是来源:@Hallaji我看不出该代码有任何错误(从第一眼看)。您是否曾调用
glLoadIdentity()
以确保在绘图之前加载了标识矩阵?不,我没有在任何地方调用
glLoadIdentity()
。:(哦,有什么问题吗?:(@Hallaji是的,您应该始终以标识矩阵作为当前矩阵开始。谢谢您的回复。您能解释一下我应该在哪里添加
glLoadIdentity()