# -*- coding:sjis -*-
import sys
import xml.parsers.expat
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import unicodedata
def init():
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
def display():
global g_rot_x, g_rot_y
glClearColor(0.0, 0.0, 0.5, 1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glPushMatrix()
gluLookAt(-5, 3.6, 7, 0, 0.5, 0, 0, 1, 0)
glRotatef(g_rot_y, 1, 0, 0)
glRotatef(g_rot_x, 0, 1, 0)
glBegin(GL_TRIANGLES)
idx = (0, 1, 2, 2, 3, 0) # colladaは四角形でデータを持っている?
for p in polygon:
for i in range(6):
glVertex3f(vertex[p[idx[i]]][0], vertex[p[idx[i]]][1], vertex[p[idx[i]]][2])
glEnd()
glPopMatrix()
glutSwapBuffers()
def reshape(w, h):
glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, (0.0 + w) / h, 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def keyboard(key, x, y):
if key == chr(27):
sys.exit(0)
def motion(x, y):
global g_rot_x, g_rot_y, g_pre_x, g_pre_y
g_rot_x += (float)(x - g_pre_x)
g_rot_y += (float)(y - g_pre_y)
g_pre_x = x
g_pre_y = y
print g_rot_x, g_rot_y
glutPostRedisplay()
def mouse(button, state, x, y):
global g_pre_x, g_pre_y
if button == GLUT_LEFT_BUTTON and state == GLUT_DOWN:
g_pre_x = x
g_pre_y = y
def start_element(name, attrs):
global stat
if name == "array" and attrs["id"] == "box-Pos-array":
stat = 1
elif name == "polygons":
stat = 2
def end_element(name):
global stat
if name == "array":
stat = 0
elif name == "polygons":
stat = 0
def char_data(data):
global vertex
if stat == 1:
v = data.split()
for a in range(len(v)):
v[a] = float(v[a].encode())
if len(v) != 0:
vertex.append(v)
elif stat == 2:
p = data.split()
for a in range(len(p)):
p[a] = int(p[a].encode())
if len(p) != 0:
polygon.append(p)
def testPrint():
for p in polygon:
for i in range(3):
print vertex[p[i]][0], vertex[p[i]][1], vertex[p[i]][2]
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
stat = 0
vertex = []
polygon = []
p.ParseFile(open('cube.xml', 'r'))
g_rot_x = g_rot_y = g_pre_x = g_pre_y = 0
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(320, 240)
glutCreateWindow('Teapot')
glutReshapeFunc(reshape)
glutKeyboardFunc(keyboard)
glutDisplayFunc(display)
glutMotionFunc(motion)
glutMouseFunc(mouse)
init()
glutMainLoop()