Skip to main content
透視変換 (Frus)
Frustum Version
視錐台の導入
• 視錐台…ワールド座標系において、描画
対象としての空間

視錐台の空間
視錐台の外は、描画対象外
視錐台の構成
遠面

近面 ( 投影面 )
基準面
遠面、近面 ( 投影 ) は任意に設定可能。
しかし、近面は遠面より近くなくてはならない
基準面より、手前に近面 ( 投影面 ) を置くことも可能

視錐台の角度、位置によって、大きさが確定する(後スライド)
視錐台決定の数式
角度 α により、 e が求まる。
Aspect 比により、 β が決定

-1

y アスペクト比 =y/x=as

基準面

1

-as

e

基準面

x

β/2

α/2

as

e

z

z

y

x
e=1/tan(α/2)

β=2*Inverse(tan(as/e))
近面 ( 投影面 ) の座標
投影面までの距離 (z 方向 ) がでれば、投影面のサイズが割り出せる
-x=n/e
-1

e
n
x
z

この場合は近面 ( 投影面 ) が基準面より近くにある場合、
だが、
基準面より遠くにあってもこの関係は変わらない
x=+n/e
y=+an/e
x=-n/e
y= -an/e
同次空間変換
2 (-1 ~ 1)
遠面

2
2

近面
( 投影面 )

視錐台の空間

同次空間

視錐台から、立方体の空間に写像 ( 変換 ) する
立方体になると、クリッピングしやすい。
その範囲は -1 ~1である。
それには、近面の x,y,z 座標が必要である。 ( 前ページに求め方記載 )
射影の方法
z= -∞
右手系座標

遠面

n,f は、座標値でなくて
視錐台までの距離であることに注意
また、 Pz は , 右手系であれば、
0<Pz<-∞
にある
近面
( 投影面 )

f(far までの距離 )

(Px,Py,Pz,1)

n(near までの距離 )
y
z

x

投影された座標値は
x= - nPx/Pz
y= - nPy/Pz

注意!
座標系が左手系の場合、
x= nPx/Pz
y= nPy/Pz  重要式1
となる
具体的な同次空間手法 (x,y)
l=left-x
r=right-x
b=bottom-x
t=top-x
(l,t,n)

(l,b,n)
n,f は、
座標値でなくて
視錐台まで
の距離である
ことに注意
(l,r,b,t は座標値 )

視錐台 ( カメラ、視野空間 ) の範囲を -1 ~1の空間に写像したい。
そのためには、どうすればいいのか?
Ex) x 軸 ( 視錐台は右手系 )
(x-l)
(r,t,n)

(r,b,n)

同次空間
2 (-1 ~ 1)

(x,y,z)
(r,b,f)
(-1,t,n)
X の縮小率 ( 拡大率 ) は
ratiox ={1-(-1)}/(r-l)
=2/(r-l)
x
= (x-l)*ratiox+(-1)
= 2(x-l)(r-l)-1
同様に y に対しても、
ratioy =2/(t-b)
y
= (y-b)*ratioy+(-1)
= 2(y-b)(t-b)-1

(r,b,n)
(1,t,n)

重要式2
具体的な同次空間手法 (z)
同時座標が右手系の場合、
-f<Pz<-n を満たす必要
( 左手系 :n<Pz<f)
z’=A/z+B 重要式3
を式としてとる。
-1 = -(A / n) +B
1 = - (A / f ) +B

n,f は座標値までの距離
( 左手系 : -1=A/n+b)
( 左手系 : 1=A/f+b)

   
  

A,B を代入操作で解くと、

右手系

2fn
a
A
f n
f n
b
B
f n

左手系

2fn
今回の課題!
 f n
Mathematica を
f n
b
使っても構いません
f n
a
同次空間の座標決定 - 右手系
x’=2(x-l)(r-l)-1
y’=2(y-b)(t-b)-1
z’=A/z+B

 


2fn
f n
f n
b
B
f n

A
a

x= nPx/Pz
y= nPy/Pz
z= Pz

代入すると、
2( x − l ) − ( r − l ) 2 x − (r + l )
=
r −l
r −l
2n
Px r + l
=
(− ) −
r − l Pz r − l
2( y − b) − (t − b) 2 x − (t + b)
y' =
=
t −b
t −b
2n
Py t + b
=
(− ) −
t − b Pz t − b

x,y,z は、視野空間での点の座標値
x’,y’,z’ は同次空間での座標値

x' =

2nf 1
f
( )+
f − n Pz
f
2nf
1
=−
(− ) +
f − n Pz
z' =

両辺を -Pz 倍する
(-Pz 除算を消す )

+n
−n
f +n
f − n 上記に合わせ、 Pz の項にマイナスを置く

2n
r +l
Px +
Pz
r −l
r −l
2n
t +b
− y ' Pz =
Py +
Pz
t −b
t −b
2nf
f +n
− z ' Pz = −
−
Pz
f −n f −n
− x' Pz =

2n
r +l
Px +
Pz
r −l
r −l
2n
t +b
− y ' Pz =
Py +
Pz
t −b
t −b
2nf
f +n
− z ' Pz = −
−
Pz
f −n f −n
− x' Pz =

 2n
 − x' Pz   r − l
− y ' Pz  

= 0
 − z ' Pz  

  0
 1  
 0


0
2n
t −b
0
0

r +l
r −l
t +b
t −b
f +n
−
f −n
0


  Px 
 
0   Py 

2nf   Pz 
 
−
f − n  1 
0 

0

ここを -1 にすれば、 -Pz の w 除算

 2n
 x'   r − l
 y ' 
 = 0
 z ' 
   0
1 
 0


0
2n
t −b
0
0

r +l
r −l
t +b
t −b
f +n
−
f −n
−1


  Px 
 
0   Py 

2nf   Pz 
 
−
f − n  1 
0 

0
同次空間の座標決定 - 左手系

課題です
まとめ
• パースペクティブ変換をした後は、パースペクティブコ
レクションを行う必要がある
 2n
x'   r − l

 y ' 
 = 0
 z ' 
   0
1 
 0


0
2n
t −b
0
0

r +l
r −l
t +b
t −b
f +n
−
f −n
−1


  Px 
 
0   Py 

2nf   Pz 
 
−
f − n  1 
0 

0

• 上記式により、同次空間へ行列変換可能。しかし、 n,f
は視野空間原点からの距離、 r,l,t,p は座標
• 同次座標は、x、y、zに対し、 -1 ~ 1 の範囲をとる
• -1,1 を超えた座標は Clipping する
• 上記行列は視野空間が右手系のみ可能であることに注意