坐标转换
从基 B 的坐标转换到基 B′ 的坐标:
[v]B′=(B′)−1B[v]B
变基矩阵
PB→B′=(B′)−1B
旋转θ矩阵
cosθ,sinθ,0,−sinθ,cosθ,0,001
Bresenham 直线算法
计算机图形学中经典的光栅化直线算法,核心思想是:利用整数增量计算,选择最接近理想直线的像素。对于0≤Δy≤Δx
p0=2Δy−Δx
p<0⇒E
p≥0⇒NE
E:p←p+2Δy $$$$
NE:p←p+2Δy−2Δx
### 透视投影矩阵
- 相机位于原点
- 相机看向 (-Z)
- 近平面 (z=-n)
- 远平面 (z=-f)
- NDC 范围:$x,y,z\in[-1,1]$
投影:设近平面距离为$n>0$,根据相似三角形
x’=-\frac{{nx}}{z}
相机空间向投影空间的变换矩阵$P$
P\begin{bmatrix}
x \
y \
z \
1
\end{bmatrix}=
\begin{bmatrix}
x_c \
y_c \
z_c \
w_c
\end{bmatrix}
再行透视除法:
x_{ndc}=\frac{x_c}{w_c}
令:
x_{c}=x,w_{c}=-\frac{z}{n}
实际工程中通常把n的比例吸收到矩阵中,因此可以简单理解为:
w_c=-z
这是透视投影矩阵最后一行出现(−1)的根本原因。在近平面上进行线性映射:
x_{ndc}
\frac{-2nx/z-(r+l)}{r-l}
为了让它能够通过透视除法得到,由:
w_c=-z$$
可得:
xc=r−l2nx+r−lr+lz
同理
yc=t−b2ny+t−bt+bz
推导 (z) 方向,假设:
zc=Az+B
那么:
zndc=−zAz+B
根据n和f映射到[−1,1],所以:
⎩⎨⎧−11=A−nB=A+fB
解得:
⎩⎨⎧AB=−f−nf+n=−f−n2fn
因此:
zc=−f−nf+nz−f−n2fn
xcyczcwc=r−l2n0000t−b2n00r−lr+lt−bt+b−f−nf+n−100−f−n2fn0xyz1
所以非对称视锥体(off-axis frustum)的透视投影矩阵:
P=r−l2n0000t−b2n00r−lr+lt−bt+b−f−nf+n−100−f−n2fn0
实际经常使用左右、上下对称的视锥体.如果使用垂直视场角 (θ) 和宽高比 (a),最终:
P=atan(θ/2)10000tan(θ/2)10000−f−nf+n−100−f−n2fn0
正交投影矩阵
不需要利用 (w) 实现透视缩放。
xndc=r−l2x−r−lr+l
yndc=t−b2y−t−bt+b
OpenGL 中z从[−n,−f]映射到[−1,1],最终:
Portho=r−l20000t−b20000−f−n20−r−lr+l−t−bt+b−f−nf+n1
重心坐标:
P1=αA+βB+γC=α+β+γ
普通线性插值:
C=αCA+βCB+γCC
透视校正插值:
C=α/wA+β/wB+γ/wCαCA/wA+βCB/wB+γCC/wC
$$