OpenGL:Pythonにロードされたときにモデルが正しく見えません
質問
私はブレンダーモデルを持っていますが、以下は、Pythonにロードするとモデルがどのようにレンダリングするかの画像です。通常はめちゃくちゃになっているようです。私は各頂点に正しい通常を使用しています。私はそれらを正しい順序でエクスポートしています。これをBlenderコンソールでテストし、実際のエクスポートファイルに適切なデータがあることをテストします。
z軸が異なるため、Pythonでモデルを回転させなければならなかったことを知っているので、通常の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()
解決
今、あなたは通常を指定しています 後 ではなく頂点 前, 、したがって、基本的には、頂点x+1の頂点xの通常を指定しています。これは、現在のコードで最も重要な欠陥です。
また、それは何ですか calculateVertexIntensity
?まず第一に、コードで照明が有効になっているので、 glColor
とにかく無視されるでしょうが、それでもここで不要なことをしようとしたように見えます-OpenGL固定関数レンダリングは、頂点に基づいた頂点強度を計算します glLight*
設定と glMaterial*
設定。
また、あなたはあなたを正常化したいかもしれません lightVector
, 、OpenGLがあなたのためにそれを正常化するかどうかはわかりません。
(また、最近のOpenGL機能を確認してください。現在、非推奨機能を使用していることを確認してください。 vertex arrays
また VBO
, 、次はです shaders
.)
他のヒント
これはあなたの通常の問題のように見えます。
データのデータ self.normals
おそらく間違っているでしょう。正常な方向に常に一連の頂点を使用して、面の周りの反時計回りの方向に頂点を使用して、各法線を計算するように、正規を再計算する必要があります。
(また、各頂点 /顔を描く前に、Glnormalを呼び出す必要があります)
(また、各頂点の色を計算すると何が起こっているのかわかりません。しかし、それが問題を引き起こしていないことを確認してください)