下面写的是我的渲染功能:
不幸的是,为了理解面部和顶点的输入方式,我将不得不提供所有链接的代码:
压缩代码以及可执行文件和示例.obj:
Source
我使用here的.obj文件来测试程序.现在,该程序不支持法线和纹理,这不是问题,因为网站上的大多数模型都没有它们.此外,(现在)它只读取“123.obj”所以该文件不应该被命名为其他任何东西.它只接受一个空间,而不是更多.
float render() { glfwSetTime(0.0f); int win_wIDth; int win_height; glfwGetwindowsize(&win_wIDth,&win_height); float win_aspect = (float)win_wIDth / (float)win_height; glVIEwport(0,win_wIDth,win_height); glMatrixMode(GL_PROJECTION); glLoadIDentity(); gluPerspective(90,win_aspect,100.0); glMatrixMode(GL_MODELVIEW); glLoadIDentity(); gluLookAt(0,50.0,0.0,1.0,0.0); glEnable(GL_DEPTH); glEnable(GL_DEPTH_TEST); glEnable(GL_color_MATERIAL); glEnable(GL_norMAliZE); glClear(GL_color_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glrotatef(angle,1,0); glcolor3f(0.0f,0.0f,0.0f); int index = 0; for(int a = 0; a < faces.size(); a++) { if(faces[a].vertices.size() == 3) { glBegin(GL_TRIANGLES); } else { glBegin(GL_QUADS); } for(int b = 0; b < faces[a].vertices.size(); b++) { index = faces[a].vertices[b]; glVertex3f(vertices[index].Dimensions[_x],vertices[index].Dimensions[_y],vertices[index].Dimensions[_z]); } glEnd(); } glfwSwapBuffers(); return (float)glfwGetTime();解决方法 这是问题所在
gluPerspective(90,100.0);
您不能将0设置为近距离,将其设置为大于0.1或1.0的值.
gluPerspective(90,100.0);
当nearclip为0时,你的所有深度都被映射到z = 1,你就会得到z格斗.
编辑:如果你有兴趣,这里有一些关于透视深度的理论:
对于距摄像机x的给定距离,您的透视变换输出certian深度值z.在farclip处,此值将最大为1,而在nearclip处它将为0.
然而,在这些值之间,关系不像您预期的那样是线性的.曲线类似于下图:
Diagram
当您将近距离设置为0时,您的曲线会发生剧烈扭曲,因此现在所有距离都会映射到z = 1.
因为这一切,你还应该尽量保持比率远:接近小于10000:1
总结以上是内存溢出为你收集整理的c – 使用OpenGL渲染3D对象(.obj文件)时闪烁全部内容,希望文章能够帮你解决c – 使用OpenGL渲染3D对象(.obj文件)时闪烁所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)