$リアルタイムCGの基礎+Android


画角(Perspective)

視点をF、

視線(レイキャスト)ベクトルE、

投影画面(レイを飛ばす元座標)をPとすると、

E = normalize(P - F)

で放射状のレイを飛ばすことで、画角を作れる。



$リアルタイムCGの基礎+Android




~直線と平面の交点を求める~

面法線をNとする。

直線の方程式
Q = E*t + P ...(1)

平面の方程式の一般形。

ax + by + cz + d = 0

a b c は法線、x y z は従法線という平面に平行で法線と直行するベクトル

dはベクトルN上の任意点(x0,y0,z0)までの距離なので、dの式が作る。

d = a*x0 + b*y0 + c*z0

最初の式に代入する

ax + by + cz + a*x0 + b*y0 + c*z0 = 0

a(x + x0) + b(y + y0) + c(z + z0) = 0

となり、もう一つの良く使われる別の平面の方程式が出来上がる。

内積表記を使う

N・(Q + S) = 0

Nx*(Qx + Sx) + Ny*(Qy + Sy) + Nz*(Qz + Sz) = 0 ...(2)


求めるのはt。tについての方程式を作る。


(2)式に(1)式を代入する。

N・(E*t + P + S) = 0

簡易化
V = P + S
とおく。

N・(E*t + V) = 0

Nx*(Ex*t + Vx) + Ny*(Ey*t + Vy) + Nz*(Ez*t + Vz) = 0

展開
Nx*Ex*t + Nx*Vx + Ny*Ey*t + Ny*Vy + Nz*Ez*t + Nz*Vz = 0

tでまとめる。
t*(Nx*Ex + Ny*Ey + Nz*Ez) + Nx*Vx + Nz*Vy + Nz*Vz = 0

t*(N・E) + (N・V) = 0

両辺から(N・V)を引く
t*(N・E) = -(N・V)

両辺を(N・E)で割る。
t* = -(N・V)/(N・E)

まとめ
V = P + S
t = -(N・V)/(N・E)