pythonでCOLLADA

# -*- 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()
  • 結果