ライトとマテリアルの設定をしてみましょう。
#!env python from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * vertex = [ [ -1.0, -1.0, 1.0 ], [ 1.0, -1.0, 1.0 ], [ -1.0, 1.0, 1.0 ], [ 1.0, 1.0, 1.0 ], [ -1.0, 1.0, -1.0 ], [ 1.0, 1.0, -1.0 ], [ -1.0, -1.0, -1.0 ], [ 1.0, -1.0, -1.0 ]] face = [ [ 0, 1, 3, 2 ], [ 2, 3, 5, 4 ], [ 4, 5, 7, 6 ], [ 6, 7, 1, 0 ], [ 1, 7, 5, 3 ], [ 6, 0, 2, 4 ]] normal = [ [ 0.0, 0.0,1.0 ], [ 0.0, 1.0, 0.0 ], [ 0.0, 0.0, -1.0 ], [ 0.0, -1.0, 0.0 ], [ 1.0, 0.0, 0.0 ], [ -1.0, 0.0, 0.0 ]] light0p = [ 0.0, 3.0, 5.0, 1.0 ] light1p = [ 5.0, 3.0, 0.0, 1.0 ] lightColor = [ 0.5, 0.5, 0.5, 1.0 ] greenColor = [ 0.0, 1.0, 0.0, 1.0 ] angleX = 0.0 angleY = 0.0 def resize(w, h): glViewport(0, 0, w, h) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(30.0, w/h, 1.0, 100.0) glMatrixMode(GL_MODELVIEW) def draw(): global angleX, angleY glClearColor(0.0, 0.0, 1.0, 0.0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) glLight(GL_LIGHT0, GL_POSITION, light0p) glLight(GL_LIGHT1, GL_POSITION, light1p) glRotated(angleX, 1.0, 0.0, 0.0) glRotated(angleY, 0.0, 1.0, 0.0) glMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, greenColor) glBegin(GL_QUADS) for j in range(0, 6): glNormal3dv(normal[j]) for i in range(0, 4): glVertex(vertex[face[j][i]]) glEnd() glFlush() glutSwapBuffers() def keyboard(key, x, y): global angleX, angleY if key=='q': sys.exit() elif key=='h': angleY += 1.0 glutPostRedisplay() elif key=='j': angleX += 1.0 glutPostRedisplay() glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(320, 320) glutCreateWindow("PyOpenGL 13") glutDisplayFunc(draw) glutReshapeFunc(resize) glutKeyboardFunc(keyboard) glClearColor(0.0, 0.0, 1.0, 0.0) glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_LIGHT1) glLight(GL_LIGHT1, GL_DIFFUSE, lightColor) glLight(GL_LIGHT1, GL_SPECULAR, lightColor) glutMainLoop()
glLight(GL_LIGHT0, GL_POSITION, light0p)
glLight(GL_LIGHT1, GL_POSITION, light1p)
glMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, greenColor)
glNormal3dv(normal[j])
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_LIGHT1)
glLight(GL_LIGHT1, GL_DIFFUSE, lightColor)
glLight(GL_LIGHT1, GL_SPECULAR, lightColor)
ライトの設定をどこで行なうかによって、移動•回転の仕方が変化します。
def dispNormal(vertex, face, normal): vers = [vertex[n] for n in face] v1 = [sum(x)/len(vers) for x in zip(*vers)] v2 = v1[:] v2 = [v+n for v,n in zip(v2, normal)] glDisable(GL_LIGHTING) glColor([1.0, 1.0, 1.0, 1.0]) glBegin(GL_LINES) glVertex(v1) glVertex(v2) glEnd() glEnable(GL_LIGHTING)
上の関数をコピーして、draw関数内で以下のように呼び出す。
for j in range(0, len(face)): dispNormal(vertex, face[j], normal[j])