我有一个搅拌器模型,下面是我将模型加载到python时渲染的图像。看起来法线都搞砸了。我正在为每个顶点使用正确的法线。我正在以正确的顺序导出它们。我在搅拌机控制台中测试了实际导出文件是否具有正确的数据。
我知道我必须在python中旋转模型,因为z轴是不同的,所以我不确定法线z是否指向错误的方向。
我正在使用pyglet。以前有没有人遇到这个问题? 我可以做些什么来尝试修复它?
我不确定这是OpenGL还是python问题。
opengl设置代码:
glMatrixMode(GL_PROJECTION)
zNear = 0.01
zFar = 1000.0
fieldOfView = 45.0
size = zNear * math.tan(math.radians(fieldOfView) / 2.0)
glFrustum(-size, size, -size / (w / h), size /
(w / h), zNear, zFar);
glViewport(0, 0, w, h);
# Set-up projection matrix
# TODO
glMatrixMode(GL_MODELVIEW)
glShadeModel(GL_SMOOTH)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
light0Ambient = (GLfloat * 4)(*[])
light0Ambient[0] = 0.2
light0Ambient[1] = 0.2
light0Ambient[2] = 0.2
light0Ambient[3] = 1.0
glLightfv(GL_LIGHT0, GL_AMBIENT, light0Ambient);
lightpos = (GLfloat * 3)(*[])
lightpos[0] = 5.0
lightpos[1] = 5.0
lightpos[2] = 5.0
glLightfv(GL_LIGHT0, GL_POSITION, lightpos)
tempLV = self.kjgCreateVectorWithStartandEndPoints((5.0,5.0,5.0), (0.0,0.0,-3.0))
lightVector = (GLfloat * 3)(*[])
lightVector[0] = tempLV[0]
lightVector[1] = tempLV[1]
lightVector[2] = tempLV[2]
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,lightVector);
glLoadIdentity( )
glTranslatef(0.0, 2.0, -18.0)
#glScalef(0.4, 0.4, 0.4)
glRotatef(-90, 1.0, 0.0, 0.0)
绘制代码:
for face in self.faces:
#print group
if len(face) == 3:
glBegin(GL_TRIANGLES)
elif len(face) == 4:
glBegin(GL_QUADS)
else:
glBegin(GL_POLYGON)
for i in face:
if i in (104,16,18,102):
glVertex3f(*self.vertices[i])
color = self.calculateVertexIntensity((.5,.5,.5),self.normals[i],self.vertices[i])
glColor3f(*color)
glNormal3f(*self.normals[i])
glEnd()
答案 0 :(得分:6)
现在你在之前指定顶点之后的正常,而不是之前的,所以基本上你要为顶点X + 1指定顶点X的法线。这是当前代码中最重要的缺陷。
另外,calculateVertexIntensity
是什么?首先,在代码中启用了光照,因此无论如何都会忽略glColor
,但看起来你似乎在这里尝试做了一些不必要的事情 - OpenGL固定函数渲染已经计算出基于glLight*
次设置和glMaterial*
设置。
另外,您可能希望规范化lightVector
,我不确定OpenGL是否会为您规范化。
(同时确保检查最近的OpenGL功能;您现在正在使用已弃用的功能,因此您很快就会遇到性能障碍。首先要注意的是vertex arrays
或VBO
,下一个是shaders
。)
答案 1 :(得分:0)
这看起来像你的法线问题。
self.normals
中的数据可能是错误的:你应该重新计算法线,确保你总是在脸部逆时针方向使用一系列顶点来计算每个法线。
(另外,你应该在绘制每个顶点/面之前调用glNormal)
(另外,我也不知道在计算每个顶点的颜色时会发生什么:但检查一下这不会导致问题)