#!/usr/bin/python
# coding: utf-8
from OpenGL.GL import *
import glut_ui
import glbase
import baseview
class OrthogonalView(baseview.BaseView):
def __init__(self, distance):
super(OrthogonalView, self).__init__()
self.head=0
self.pitch=0
self.distance=distance
def onMotion(self, x, y):
self.head+=x-self.x
self.pitch+=y-self.y
self.x=x
self.y=y
# 再描画したいのでTrueを返す
return True
def updateProjection(self):
l=-self.w/2
r=-l
b=-self.h/2
t=-b
n=0
f=1000
glOrtho(l, r, b, t, n, f)
def updateView(self):
glTranslate(0, 0, -self.distance)
glRotate(self.head, 0, 1, 0)
glRotate(self.pitch, 1, 0, 0)
if __name__=="__main__":
import Cube
glut_ui.run(
glbase.BaseController(
OrthogonalView(200),
Cube.createCube(100)))
http://pyopengl.sourceforge.net/documentation/manual-3.0/glOrtho.xhtml
行列を見ると、スケーリングしてから移動となっている。 ここで注意を要するのはZ成分のスケールに負の値があること。これは投影行列適用後のZ値は小さいほうが手前で大きいほうが奥になることを意味する。 OpenGLの内部座標は右手系(Zの+方向が手前)なので、ここでこそっと入れ替えている。
今までは内部座標の表示範囲はX軸-1~+1、Y軸-1~+1に限定されていた。Z軸にも-1〜+1の表示範囲があった。要するに、
glOrtho(-1, 1, -1, 1, -1, 1)
がデフォルトである。
glOrthoで指定される表示範囲を視体積(view volume)という。 視体積で実切れた三角形は、自動的に視体積との交線で三角形を分解して範囲内だけが描画される。範囲外切捨て処理をクリッピングという。
glVertexの第3引数省略は自動的に0を補う。