Table Of Contents

Previous topic

Projection Matrix

Next topic

透視投影

This Page

平行投影(orthogonal projection)

Ortho.py

#!/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)))

glOrtho

http://pyopengl.sourceforge.net/documentation/manual-3.0/glOrtho.xhtml

\begin{pmatrix}
\frac{2}{right-left} &0 &0 &t_{x} \\
0 &\frac{2}{top-bottom} &0 &t_{y} \\
0 &0 &\frac{-2}{farVal-nearVal} &t_{z} \\
0 &0 &0 &1 \\
\end{pmatrix}

行列を見ると、スケーリングしてから移動となっている。 ここで注意を要するのはZ成分のスケールに負の値があること。これは投影行列適用後のZ値は小さいほうが手前で大きいほうが奥になることを意味する。 OpenGLの内部座標は右手系(Zの+方向が手前)なので、ここでこそっと入れ替えている。

OpenGLのデフォルト投影

今までは内部座標の表示範囲はX軸-1~+1、Y軸-1~+1に限定されていた。Z軸にも-1〜+1の表示範囲があった。要するに、

glOrtho(-1, 1, -1, 1, -1, 1)

がデフォルトである。

視体積(view volume)とクリッピング

glOrthoで指定される表示範囲を視体積(view volume)という。 視体積で実切れた三角形は、自動的に視体積との交線で三角形を分解して範囲内だけが描画される。範囲外切捨て処理をクリッピングという。

glVertexの第3引数省略は自動的に0を補う。

inserted by FC2 system