OpenGL: Modell sieht nicht richtig aus, wenn sie in Python geladen
Frage
ich einen Mixer Modell habe und unten ist ein Bild davon, wie mein Modell macht, wenn ich es in Python laden. Es sieht aus wie die Normalen alle messed up sind. Ich bin mit der richtigen normal für jeden Vertex. Ich bin sie in der richtigen Reihenfolge zu exportieren. Ich teste diese in der Mixer-Konsole, dass die tatsächliche Exportdatei die richtigen Daten hatte.
Ich weiß, dass ich das Modell in Python drehen musste, weil z-Achse unterschiedlich ist, so dass ich nicht sicher bin, ob die Normalen z in der falschen Richtung zeigt.
Ich verwende Pyglet. Hat jemand schon einmal hat dieses Problem vor? Irgendwelche Ideen, was ich tun kann, um zu versuchen, es zu beheben?
Ich bin nicht sicher, ob dies ein OpenGL oder Python Problem.
opengl Setup-Code:
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)
Zeichnen Code:
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()
Lösung
Im Moment geben Sie an dem normalen nach , um den Scheitelpunkt anstelle von vor , so dass im Grunde bist du die normale Vertex X für den Scheitelpunkt Angabe X + 1. Dies ist der wichtigste Fehler im aktuellen Code.
Auch, was ist das calculateVertexIntensity
? Zunächst einmal wird die Beleuchtung in Ihrem Code aktiviert, so glColor
ohnehin ignoriert werden wird, aber immer noch sieht es aus wie Sie unnötige hier etwas zu tun versucht - bereits die OpenGL feste Funktion Rendern die Vertex Intensität Stationierung auf den glLight*
Einstellungen und glMaterial*
wird berechnen Einstellungen.
Auch möchten Sie vielleicht Ihre lightVector
normalisieren, ich bin nicht sicher, ob OpenGL es für Sie normalisieren würde.
(Vergewissern Sie sich auch auf der jüngsten OpenGL überprüfen gehört, du bist veraltet Funktionen jetzt und aus diesem Grund werden Sie bald traf eine Leistung Barriere Das erste, was zu sehen ist auch vertex arrays
oder VBO
, die. nächstes ist shaders
.)
Andere Tipps
Das sieht wie ein Problem mit dem Normalen.
Die Daten in self.normals
ist wahrscheinlich falsch. Sie Normalen dafür, dass neu berechnen sollen, dass Sie immer eine Folge von Ecken entgegen dem Uhrzeigersinn um das Gesicht verwenden, um jeden normal zu berechnen
(auch, sollten Sie GlNormal anrufen, bevor jede Ecke / Gesichtszeichnung)
(auch auch, ich weiß nicht, was los ist, wenn Sie die Farbe für jeden Scheitelpunkt berechnen: aber prüfen, ob das wird Problem nicht verursacht)