画角(Perspective)
視点をF、
視線(レイキャスト)ベクトルE、
投影画面(レイを飛ばす元座標)をPとすると、
E = normalize(P - F)
で放射状のレイを飛ばすことで、画角を作れる。
床
~直線と平面の交点を求める~
面法線を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)