3D数学与光照
光的方向
在物理里,常用黄色箭头描述光的入射,
∠
θ
∠\theta
∠θ即为入射角
但在模型计算光照时,光照入射向量会被统一到原点,和法向量的夹角变成
180
°
−
∠
θ
180°-∠\theta
180°−∠θ,不符要求
所以使用从顶点指向光源的向量为入射光
由
c
o
s
(
α
)
=
v
1
⃗
⋅
v
2
⃗
∣
v
1
⃗
∣
∣
v
2
⃗
∣
cos(\alpha)=\frac{\vec{v_1} \cdot \vec{v_2}}{|\vec{v_1}||\vec{v_2}|}
cos(α)=∣v1∣∣v2∣v1⋅v2可知,当
α
≥
90
°
\alpha\geq90°
α≥90°时,
v
1
⃗
⋅
v
2
⃗
≤
0
\vec{v_1} \cdot \vec{v_2}\leq0
v1⋅v2≤0,此时不受光照影响
再令
v
1
⃗
和
v
2
⃗
\vec{v_1} 和\vec{v_2}
v1和v2转化为单位向量,此时
1
≥
c
o
s
(
α
)
=
v
1
⃗
⋅
v
2
⃗
≥
0
1\geq cos(\alpha)=\vec{v_1} \cdot \vec{v_2}\geq0
1≥cos(α)=v1⋅v2≥0。入射角越小,光照越强烈<=>cosα值越大,
从向量叉积的左手螺旋法则可知,需要构建正确的法向量需要顺时针旋转的两个向量
如果从一个三角面来看,如果以点A为原点,v1和v2需要顺时针旋转,则点B和点C也需要顺时针方向,所以构建边的顺序需要为AB,AC
背面剔除
如图所示,当法向量和相机向量角度大于等于90°时,无论平面受不受光照影响,都不显示。即背面剔除
高光反射
如图所示,当光的反射向量和摄像机的方向向量方向相近时,高光强烈
计算反射向量:
让L向量从顶点出发。并且N、L都为单位向量
L
⃗
+
R
⃗
=
2
C
o
s
(
∠
N
L
)
∗
N
⃗
=
2
L
⃗
⋅
R
⃗
∗
N
⃗
\vec L+\vec R=2Cos(∠NL)*\vec N=2\vec L\cdot \vec R*\vec N
L+R=2Cos(∠NL)∗N=2L⋅R∗N
R
⃗
=
2
L
⃗
⋅
R
⃗
∗
N
⃗
−
L
⃗
\vec R=2\vec L\cdot \vec R*\vec N-\vec L
R=2L⋅R∗N−L
BlinnPhone高光
由于普通的高光需要计算两次点积,使用BlinnPhone可以减少一次点积运算
使用光向量加摄像机向量得到半角向量H
H和N越近,高光越强