GLUT Display callback <function render at 0x0000023FEA573E20> with (),{} failed: returning None 'Mesh' object has no attribute 'material'报了这个错
时间: 2023-12-14 17:03:53 浏览: 138
glut库文件-错误: 无法打开包括文件:“gl/glut.h”
5星 · 资源好评率100%
非常抱歉,我之前的代码还是有误。在PyWavefront库中,我们需要使用`mesh.materials`而不是`mesh.material`来设置OpenGL的材质属性。另外,在PyWavefront库的新版本中,`mesh.faces`属性已经被弃用,我们需要使用`mesh.material.faces`来遍历每个面。下面是修正后的代码:
```python
import pywavefront
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
# 初始化OpenGL
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(800, 600)
glutCreateWindow("OBJ Model Viewer")
# 加载OBJ模型
model = pywavefront.Wavefront('model.obj')
# 渲染函数
def render():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0)
glRotatef(0.1, 0, 1, 0)
glRotatef(0.1, 1, 0, 0)
# 遍历每个面和顶点
for mesh in model.mesh_list:
material = mesh.materials
glMaterial(GL_FRONT_AND_BACK, GL_AMBIENT, material.ambient)
glMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE, material.diffuse)
glMaterial(GL_FRONT_AND_BACK, GL_SPECULAR, material.specular)
glMaterial(GL_FRONT_AND_BACK, GL_SHININESS, material.shininess)
glBegin(GL_TRIANGLES)
for face_i in material.faces:
face = mesh.faces[face_i]
for vertex_i in face:
vertex = mesh.vertices[vertex_i]
glNormal3f(*mesh.normals[vertex.normal_index])
glVertex3f(*vertex.vertex)
glEnd()
glutSwapBuffers()
# 注册OpenGL回调函数
glutDisplayFunc(render)
glutIdleFunc(render)
# 启动OpenGL主循环
glutMainLoop()
```
在上面的代码中,我们首先遍历每个mesh对象,并使用`mesh.materials`属性设置OpenGL的材质属性。然后,我们使用`glBegin`和`glEnd`函数来绘制每个三角形面,并在循环中遍历每个顶点。在每个顶点处,我们使用`glNormal3f`函数设置法向量,使用`glVertex3f`函数设置顶点坐标。最后,我们使用`glutMainLoop`函数启动OpenGL的主循环,使程序一直运行直到用户关闭窗口。
阅读全文