4. 2006-2013 H. SHIOZAWA http://vilab.org
4
9.3 透視投影の計算(p.36参考)
視体積の正規化
x n x z n : : (y軸も同様)
n
n
x x n n
,
x,y座標を-1~+1の範囲に収める
n
p
y
x
n
n
p
x
z ( f n )
2
fn
z p
z f n
( )
z
k
y
y
(x, z)
x(またはy)
(xn, -n)
O -n -f
z座標も,-1~+1の範囲に収める
z=-n のときzp=+1.0
z=-f のときzp= -1.0
三角形の相似より(z<0に注意)
z
y y
z
z
k
k
x
x x
OpenGL/Processingの計算式⇒
(教科書の方式は,0.0~1.0)
kx
z
-kx
z
5. 2006-2013 H. SHIOZAWA http://vilab.org
5
9.4 透視投影行列(p.36参考)
同次座標で表現 透視投影行列
OpenGL/Processingの方式
0 0 0
n
n
0 0 0
f
n
p
x
y
p
2
0 0
z
p
proj proj view P M P
ここまでの座標変換の合成
fn
x
y
1
0 0 1 0
z
f n
f n
k
k
w
y
x
p
p
p
x
y
p
p
p
p
p
z
w
x
y
z
x x w
p p p
y y w
p p p
z z w
p p p
f n
n
p
w z
n
fn
f n
z
f n
z
y
k
x y
k
x
p
y
p
x
p
2
proj proj view local P M M M P model
9.3の式を同次座標で表す
このときw'p = -z とすると便利
w'pに視点からの
奥行情報が残る
6. 2006-2013 H. SHIOZAWA http://vilab.org
6
60°
画面の表面
視点
d H 3 2
n d 10
H height
f d 10
9.5 透視投影関数
perspective(fov, aspect, n, f)
ただし,すべての引数はゼロ以外
aspectは,floatで計算すること
バージョン1.x ⇒ OPENGLが正確
W
H
透視投影関数
n
f
aspect=W/H
fov
画角
(視野角)
視体積の縦横比
前方・後方クリッピ
視点ング面までの距離
Processingのデフォルト設定
perspective()を呼ばない場合
または,引数なしで呼んだ場合
画角(視野角) = 60°(π / 3)
aspect = width / height
12. 2006-2013 H. SHIOZAWA http://vilab.org
12
9.11 参考:平行投影(p.37)
平行投影(直交投影)
視体積(ビューボリューム)
視体積=「見える領域」
平行投影の視体積は直方体
平行投影関数
ortho(xmin, xmax, ymin, ymax,
zmin, zmax)
正規化視体積
各座標の値を-1~+1に正規化
直方体→ 立方体
z座標は0~1にする方式もある
計算式
xmin xmax
ymin
ymax
zmin
zmax
(-1,-1,-1)
x
(-1,-1,+1)
(+1,+1,-1)
(+1,+1,+1)
x x x
2 (
)
max min xp
x x
max min
y, z も同様(教科書はzは0~1)
13. 2006-2013 H. SHIOZAWA http://vilab.org
13
9.12 参考:平行投影行列(p.37参考)
平行投影の計算
xmax-xmin
x
2
xp
変換行列による表現
min
x
x
x x
max min
x x x
2 (
)
max min
x
x
max min
max min
x x
max min
2
x
max min
2 1
x x
x x
xp
x
x
max min
y
y
max min
z
z
max min
0 0
0
2
2
2
x
y
1
0
0 0
0 0 0 1
x
y
p
p
1
max min
max min
max min
max min
max min
max min
z
z z
z z
y y
y y
x x
x x
z
p
視点
座標
正規化
視体積
の座標
y座標,
z座標も
同様
xmin xmax
-1 +1
視点座標
正規化
視体積