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()

alt text

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top