PyOpenGL はじめました:animation

PyOpenGL はじめました記事一覧
animation

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2006/09/21 ● 第1版♪2009/04/07

■ 概要

アニメーション効果を利用して、立体が動く様子を表現できます。

事例:アニメーション

$ python2.5 animatiecolorCube.py

立方体が回転します
アプリケーションを起動すると(アニメーション効果によって)立方体が回転します。

事例:コードの解説

#! /usr/bin/python2.5
from PyoGL.Goodies.PyoWindow import *
from time import sleep

class ex_animatiecolorCube(object):
    _angle = 0.0
    _frameRate = 25

    def __init__(self, *args):
        if args:
            args = map(float, *args)
        else:
            args = 1, 1, 1
        self._args = args
引数 args には、回転軸を指定できます。引数を省略すると、1,1,1 を指定したものと見なされます。すると、原点(立方体の中心)とその対角(黄色の頂点)を結ぶ直線が、回転軸になります。
■ examples
    @classmethod
    def ex1(self):
        model = ex_animatiecolorCube()
        w = PyoWindow(model)
        w.open(800,100,200,200,
            displayMode= GLUT_RGB | GLUT_DEPTH,
            )
ウィンドウ PyoWindow を開いて、その中にモデル ex_animatiecolorCube を表示します。
■ glutDisplayFunc
    def display(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(-2, 2, -2, 2, -2, 2) 
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glRotatef(self._angle, *self._args)
        self._drawElements()
        glutSwapBuffers()

    def _drawElements(self):
        vertices = [
            -1,-1, 1,  -1,1, 1,  1,1, 1,  1,-1, 1,
            -1,-1,-1,  -1,1,-1,  1,1,-1,  1,-1,-1,
            ]
        colors = [
            0, 0, 0,  1, 0, 0,  1, 1, 0,  0, 1, 0,     # black, red, yellow, green
            0, 0, 1,  1, 0, 1,  1, 1, 1,  0, 1, 1,     # blue, magenta, white, cyan
            ]
        indices = [
            0, 3, 2, 1,  2, 3, 7, 6,  0, 4, 7, 3,
            1, 2, 6, 5,  4, 5, 6, 7,  0, 1, 5, 4,
            ]
        glEnableClientState(GL_COLOR_ARRAY)
        glEnableClientState(GL_VERTEX_ARRAY)
        glColorPointer(3, GL_FLOAT, 0, colors)
        glVertexPointer(3, GL_FLOAT, 0, vertices)
        glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices)
        glDisableClientState(GL_COLOR_ARRAY)
        glDisableClientState(GL_VERTEX_ARRAY)
ウィンドウを再描画する関数を規定します。 ⇒ 続きはこちら glutDisplayFunc
■ glutKeyboardFunc
    def keyboard(self, *args):
        frameRate = self._frameRate
        key, x, y = args
        if key == '\x1b':   # escape
            exit()
        if key == '<':
            frameRate /= 2
            if frameRate<1: frameRate = 1
        if key == '>':
            frameRate *= 2
        self._frameRate = frameRate
        glutPostRedisplay()
キーボード操作に呼応する関数を規定します。 ⇒ 続きはこちら glutKeyboardFunc
■ glutIdleFunc
    def idle(self):
        angle = self._angle
	angle += 1
        if angle > 360:
            angle %= 360
        self._angle = angle
        sleep(1 / float(self._frameRate))
        glutPostRedisplay()
イベントが発生していないときに起動される関数を規定します。 ⇒ 続きはこちら glutIdleFunc
■ misc
    ## ---------------------------------------- private
    def _init(self): 
        glClearColor(0,0,0,0)
        glEnable(GL_DEPTH_TEST)

Tips

》作業中です《
Last updated♪09/05/14