透視変換の実践
Yasuhiro Todoroki
透視変換とは
手前の物が大きく、奥に行くほど小さく見える様に施す変換
臨場感を出すための効果。

変換前

変換後
透視変換とは
• 手前の物は大きく、奥の物は小さく投影
面に映す。
• 計算は意外と Simple で、小学校の時の知
識があれば、算出可能

•手前の物は大きく
•奥の物は小さく投影面に映す。

距離が近ければ大きく映せば良い
注意点
本によって様々なとらえ方
原点をどこにするかで式が異なる

通常はこちらで考える
Type2

Type1

z

z

ここが基準

d
d
E

ここが基準

E
Type1

P

R ( xs,ys,zs )
点 P をスクリーン上に投影したい

d

z
Type1

P

スクリーン上の点を求めるには
相似比を用いる
今 R が( xs,ys,zs )
であるとするならば、

R ( xs,ys )

d

z
Type1
(x,y,z)
P

R が( xs,ys,d )
P が (x,y,z)
であるとするなら
ば、
xs : d = x : z
ys : d = y : z
zs : d = z : z

R ( xs,ys,d )

故に
xs=xd/z ..y,z
ys=yd/z ..y,z

d

z

これを Matrix 形式
で!
Type2

P

R ( xs,ys )
点 P をスクリーン上に投影したい

d

z
Type2

P

スクリーン上の点を求めるには
相似比を用いる
今 R が( xs,ys )
であるとするならば、

R ( xs,ys )

d

z
Type2
(x,y,z)
P

R が( xs,ys )
P が (x,y,z)
であるとするなら
ば、
xs : d = x : (d+z)
ys : d = y : (d+z)
zs : d = z : (d+z)

R ( xs,ys,zs )

故に
xs/d=x/(d+z) ..y,z
xs=x*d/(d+z) ..yz
d

z

これを Matrix 形式
で!
注意事項
スクリーンはどこにおいても良いことに注意
モデリング座標のデータを、
Rotation,Moving し、
ワールド座標系設置する。
その後に視野変換を施し、
スクリーンの投影位置を決める。

d
Type1 のマトリックス
単純に考えた形
0
0
d / z
 0
d/z
0

 0
0
d/z

0
0
 0
d 0
0 d

0 0

0 0

0  x 
0  y 
 
0  z 
 
1  1 
0 0  x  1 0 0
0 0   y  0 1 0
  = 
d 0   z  0 0 1
  
1 0   1  0 0 1 / d

d 0
0 d

0 0

0 0

0
0
1
1

0  x  1
0   y  0
  = 
0   z  0
  
0   1  0

0 0
1 0
0 1/ d
0 1/ d

0  x 
0  y 
 
0  z 
 
0  1 
0  x 
0  y 
 
0  z 
 
0  1 

同次座標系の特性をうまく利用した例
上記の方法では Z 座標のデータがすべてすっ飛んでしまう。
これにより、 Z 情報は保存される。
OpenGL と DirectX の透視変換行列
openGL
[2/(right-left) 0

0

(-right-left)/(right-left)]

[0

2/(top-bottom) 0

(-top-bottom)/(top-bottom)]

[0

0

-2/(far-near) (-far-near)/(far-near)]

[0

0

0

1]

DirectX

http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__3/

視野変換1(基礎編)