2

私はブレンダーモデルを持っています。以下は、Pythonにロードしたときにモデルがどのようにレンダリングされるかを示す画像です。法線がすべて台無しになっているようです。各頂点に正しい法線を使用しています。正しい順序でエクスポートしています。私はこれをBlenderコンソールでテストし、実際のエクスポートファイルに正しいデータが含まれていることを確認しました。

z軸が異なるため、Pythonでモデルを回転させる必要があることはわかっています。したがって、法線zが間違った方向を向いているかどうかはわかりません。

私はピグレットを使用しています。誰かが以前にこの問題を抱えたことはありますか?それを修正するために私ができることのアイデアはありますか?

これが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()

代替テキスト

4

2 に答える 2

6

現在、頂点のではなく頂点のに法線を指定しているので、基本的には頂点X+1の頂点Xの法線を指定しています。これは、現在のコードの最も重要な欠陥です。

また、それは何calculateVertexIntensityですか?まず、コードでライティングが有効になっているためglColor、とにかく無視されますが、それでもここで不要なことをしようとしたようです。OpenGL固定関数レンダリングでは、glLight*設定とglMaterial*設定に基づいて頂点強度がすでに計算されています。

また、あなたはあなたのを正規化したいかもしれませんlightVector、私はOpenGLがあなたのためにそれを正規化するつもりであるかどうかわかりません。

(また、最近のOpenGL機能を確認してください。現在非推奨の関数を使用しているため、すぐにパフォーマンスの障壁にぶつかることになります。最初に探すのはvertex arraysまたはVBO、次はshadersです。)

于 2010-11-14T17:44:54.160 に答える
0

これは法線の問題のように見えます。

のデータself.normalsはおそらく間違っています。法線を再計算して、各法線を計算するために、顔の周りの反時計回りの方向の頂点のシーケンスを常に使用するようにする必要があります。

(また、各頂点/面を描画する前にglNormalを呼び出す必要があります)

(また、各頂点の色を計算するときに何が起こっているのかわかりませんが、それが問題を引き起こしていないことを確認してください)

于 2010-11-14T16:40:43.103 に答える