gpt4 book ai didi

OpenGL 将盒子从里到外渲染

转载 作者:行者123 更新时间:2023-12-02 08:35:26 26 4
gpt4 key购买 nike

我正在尝试在 OpenGL 中创建 2 个盒子,但它们看起来是由内而外的,有时它们不能正确重叠。视频 http://www.youtube.com/watch?v=IVJu4zJFp7Q

我猜这是一个深度问题,但我无法弄清楚我做错了什么。

这是我用来初始化的代码:

glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glDisable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);

这是我的显示功能 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

drawYellowBox();
drawBlueBox();

以及我用来绘制形状的代码:

glPushMatrix();
glBegin(GL_QUADS);

glColor3f(0.15, 0.15, 0.0);
// draw front
glVertex3f(-1.0, -1.5, 1.0);
glVertex3f( 1.0, -1.5, 1.0);
glVertex3f( 0.75, 1.5, 0.75);
glVertex3f(-0.75, 1.5, 0.75);

glColor3f(0.3, 0.3, 0.0);
// draw back
glVertex3f( 1.0, -1.5, -1.0);
glVertex3f(-1.0, -1.5, -1.0);
glVertex3f(-0.75, 1.5, -0.75);
glVertex3f( 0.75, 1.5, -0.75);

glColor3f(0.45, 0.45, 0.0);
// draw left
glVertex3f(-1.0, -1.5, -1.0);
glVertex3f(-1.0, -1.5, 1.0);
glVertex3f(-0.75, 1.5, 0.75);
glVertex3f(-0.75, 1.5, -0.75);

glColor3f(0.6, 0.6, 0.0);
// draw right
glVertex3f( 1.0, -1.5, 1.0);
glVertex3f( 1.0, -1.5, -1.0);
glVertex3f( 0.75, 1.5, -0.75);
glVertex3f( 0.75, 1.5, 0.75);

glColor3f(0.75, 0.75, 0.0);
// draw top
glVertex3f(-0.75, 1.5, 0.75);
glVertex3f( 0.75, 1.5, 0.75);
glVertex3f( 0.75, 1.5, -0.75);
glVertex3f(-0.75, 1.5, -0.75);

glColor3f(0.9, 0.9, 0.0);
// draw bottom
glVertex3f(-1.0, -1.5, -1.0);
glVertex3f( 1.0, -1.5, -1.0);
glVertex3f( 1.0, -1.5, 1.0);
glVertex3f(-1.0, -1.5, 1.0);
glEnd();

glPopMatrix();

glPushMatrix();
glTranslatef(0.0,2.5,0.0);
glRotatef(joint_ui_data->getDOF(Keyframe::HEAD), 0.0, 1.0, 0.0);


glBegin(GL_QUADS);

glColor3f(0.0, 0.15, 0.15);
// draw front face
glVertex3f(-0.8, -0.45, 0.8);
glVertex3f( 0.8, -0.45, 0.8);
glVertex3f( 0.75, 0.45, 0.75);
glVertex3f(-0.75, 0.45, 0.75);

glColor3f(0.0, 0.3, 0.3);
// draw back face
glVertex3f( 0.8, -0.45, -0.8);
glVertex3f(-0.8, -0.45, -0.8);
glVertex3f(-0.75, 0.45, -0.75);
glVertex3f( 0.75, 0.45, -0.75);

glColor3f(0.0, 0.45, 0.45);
// draw left face
glVertex3f(-0.8, -0.45, -0.8);
glVertex3f(-0.8, -0.45, 0.8);
glVertex3f(-0.75, 0.45, 0.75);
glVertex3f(-0.75, 0.45, -0.75);

glColor3f(0.0, 0.6, 0.6);
// draw right face
glVertex3f( 0.8, -0.45, 0.8);
glVertex3f( 0.8, -0.45, -0.8);
glVertex3f( 0.75, 0.45, -0.75);
glVertex3f( 0.75, 0.45, 0.75);

glColor3f(0.0, 0.75, 0.75);
// draw top
glVertex3f(-0.75, 0.45, 0.75);
glVertex3f( 0.75, 0.45, 0.75);
glVertex3f( 0.75, 0.45, -0.75);
glVertex3f(-0.75, 0.45, -0.75);

glColor3f(0.0, 0.9, 0.9);
// draw bottom
glVertex3f(-0.8, -0.45, -0.8);
glVertex3f(-0.8, -0.45, 0.8);
glVertex3f( 0.8, -0.45, 0.8);
glVertex3f( 0.8, -0.45, -0.8);
glEnd();
glPopMatrix();

谢谢。

最佳答案

问题在于您发送顶点的顺序。

正如我们在代码中看到的,正面的顶点顺序是。

// Front
glVertex3f(-1.0, -1.5, 1.0); // Left Top
glVertex3f( 1.0, -1.5, 1.0); // Right Top
glVertex3f( 0.75, 1.5, 0.75); // Right Bottom
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom

正如我们在这段代码中看到的,您顺时针发送顶点。 OpenGL 默认情况下逆时针读取所有多边形。这就是为什么所有相​​对的面都被删除/隐藏(剔除)。

要解决此问题,您可以执行以下两件事之一。

  1. 更改glFrontFace()的模式所以它变成了GL_CW,而不是GL_CCW。但请记住,该更改将影响调用 glFrontFace(GL_CW) 后发生的所有事情,因此如果在任何其他点渲染某些内容,请记住再次调用 glFrontFace(GL_CCW)再次逆时针缠绕。

  2. 更改发送顶点的顺序。

来自

// Front
glVertex3f(-1.0, -1.5, 1.0); // Left Top
glVertex3f( 1.0, -1.5, 1.0); // Right Top
glVertex3f( 0.75, 1.5, 0.75); // Right Bottom
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom

// Front
glVertex3f(-1.0, -1.5, 1.0); // Left Top
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom
glVertex3f( 0.75, 1.5, 0.75); // Right Bottom
glVertex3f( 1.0, -1.5, 1.0); // Right Top

不过,如果您已经拥有大量网格,那么只需将 glFrontFace 模式更改为 GL_CW 可能会容易得多。

额外

此外,如果您想更改哪些面被剔除,您还可以更改 glCullFace 的模式。 ,对于GL_FRONTGL_BACKGL_FRONT_AND_BACK,初始值为GL_BACK

请记住,您需要调用 glEnable(GL_CULL_FACE) 来启用基于顶点缠绕的多边形剔除。

编辑

如果这不是一个顶点缠绕问题,它可能(尽管这会很奇怪)是一个深度测试问题。

将此代码添加到您的初始化代码中。

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

关于OpenGL 将盒子从里到外渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19743282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com