繪圖工具
窗口到視口的變換,(x,y)→(sx,sy)(Wl,Wr,Wb,Wt)→(Vl,Vr,Vb,Vt)
sx=Ax+C,sy=By+D,Vl=AWl+C,Vr=AWr+C,A=(Vr-Vl)/(Wr-Wl),C=Vl-AWl=(WrVl-WlVr)/(Wr-Wl)
寬高比:if world aspect ratio R>W/H,viewport(0,W,0,W/R)else viewport(0,H✖️R,0,H)
Cohen-Sutherland 裁剪算法
do{
形成p1,p2的碼字(e.g. FTFT)
if 平凡接受 return 1(case FFFF && FFFF)
if 平凡拒絕 return 0(case p1 and p2 has same T)
將線段在下一個窗口處階段(最多循環4次,在4個邊界處截斷:根據比例關係重新計算 x 值或 y 值)
}while(1);
向量工具
向量的點乘:求向量的夾角 cos θ
向量的叉乘:應用矩陣,計算向量之間的面積
向量的分解:c=k·v+m·v⊥,同乘 v 或 v⊥,得到 k=c·v/v·v,m=c·v⊥/v⊥·v⊥,distance=m·v⊥
向量的反射:r-a=2(-a·n)·n → r=a-2(a·n)·n
點的任意仿射組合是一個合理的點,E=fP+gR(f+g=1),證明:座標系平移 u 後,E’=E+u=fP+gR+(f+g)u
點與向量的和與點的仿射組合等價:P=A+t(B-A)== P=tB+(1-t)A
直線:l(t)=C+b·t,fx+gy=1,n·(R-C)=0
平面:p(s,t)=C+s·a+b·t,p(s,t)=sA+tB+(1-s-t)C
判斷平面多邊形的凸性:所有相鄰邊向量的叉乘都指向平面的內側或外側
判斷點Q是否在凸多邊形內:對凸多邊形每個點Pi,(Q-Pi)·ni<0
凸多邊形和線段的裁剪算法:enter:t-in=max(t-in,t-hit),exit:t-out=min(t-out,t-hit)
線性插值:lerp(a,b,t)= a +(b-a)t = a(1-t)+ bt
矩陣工具
矩陣求逆:增廣矩陣A|E通過初等(行)變換,代數餘子式轉置得伴隨矩陣 A*:aij=Mji/|M|
矩陣分塊求逆:
矩陣分塊求逆:
正交矩陣:各行(列)相互正交 ==
仿射變換
基本仿射變換:平移,旋轉(c,-s,0;s,c,0;0,0,1),放縮,剪切,逆變換
仿射變換組合
繞任一點旋轉(平移 - 的點左邊,旋轉,平移回去)
關於過原點直線的反射(旋轉角度到 x 軸,關於 x 軸反射:即 【1,-1】的縮放,旋轉回去)
仿射變換的性質:證明的話針對每一種基本仿射變換證明
保持點的仿射組合
保持共線和共面的關係
保持直線和平面的平行性
矩陣的列揭示了變換後的座標系
保持相互比例
經矩陣 M 仿射變換後面積爲原來的 |det M| 倍
每一個仿射變換都由基本仿射變換組成
三維仿射變換關於某一座標軸的旋轉(y-roll:c,s;-s,c)
關於任意軸的旋轉(歐拉定理:關於某個點的任何旋轉等價於繞通過此點的某個軸的單一旋轉)
經典方法:先變換到某一座標軸,基本旋轉,逆變換,Ru(ß)=Ry(-θ)Rz(φ)Rx(ß)Rz(-φ)Ry(θ)
構造性方法:找出旋轉軸和旋轉角度
座標系變換:(i’,j’,k’)= M(i,j,k)(a,b,1)= M(c,d,1)due to ai=ci’=cMi
相機
根據up、eye、look 計算 n、u、v,歸一化!!!
世界座標到相機座標的轉換矩陣
移動攝像機:eye+=u+v+n,look+=u+v+n,up 不變
旋轉攝像機:u’= cos(α)u + sin(α)v、v’= -sin(α)u + cos(α)v
透視投影
點的透視投影:(x*,y*)=(NPx/(-Pz),NPy/(-Pz))
證明:通過從原點到 P 點的光線和視平面的交點 A
光線 t=0 在原點,t=1 在 P 點,參數方程爲 r(t)= Pt
Pt0=A,Pzt0=Az=-N,t0=-Pz/N
直線的透視投影:P(t)= A+ct,P(t)=(N(Ax+cxt)/(-Az-czt),N(Ay+cyt)/(-Az-czt))
證明!!!
若直線平行於視平面:cz=0,P(t)= N/-Az(Ax+cxt,Ay+cyt)
若直線不平行於視平面:P(無窮)=(Ncx/-cz,Ncy/-cz)(直線的滅點)
增加僞深度:(x*,y*,z*)=(NPx/(-Pz),NPy/(-Pz),(aPz+b)/-Pz)
從 N 到 F,僞深度從-1到1,所以 a= -(F+N)/(F-N),b= -2FN/(F-N)
使用齊次座標
透視變換和正交投影
透視變換的幾何性質
通過視點的直線被映射爲平行於 z 座標軸的直線
證明:這種直線上的所有點都被映射爲視平面上的同一點(x*,y*),z* 取遍-1到1
與 z 座標軸垂直的直線映射後依然垂直於 z 座標軸
證明:這種直線上的點具有相同的 z 值,所以映射後也有相同的僞深度值
透視矩陣:平移(-(l+r)/2,-(b+t)/2)縮放(2/(r-l),2/(t-b))
使用正則視景體 CVV 對面片進行裁剪 AC:A+(C-A)t
以 x=-1 爲例:ax/aw>-1 即 BCo= ax+aw>0
直線在內,平凡接受:兩個端點都在 CVV 內,12個 BC 值爲正
直線在外,平凡拒絕:兩個端點都同一個平面外
計算相交 t 值,以 x=1 爲例:(ax+(cx-ax)t)/(aw+(cw-aw)t),t=(aw-ax)/((ax-ax)-(cw-cx))
視口變換:照相機寬高比(近平面寬高比) → 正則寬高比(1.0) → 視口寬高比
紋理映射
爲什麼不能線性插值:投影后面片上相等的間隔並不對應於三維面片上相等的間隔(近大遠小)
顏色線性插值
曲線設計
德卡斯特里奧算法
三點:
四點:
圖形繪製管道
M:仿射變換
V:相機矩陣
Shade:着色
Perspective transformation:透視矩陣
clip:裁剪
Perspective division:透視除法
viewport:窗口到視口的映射
screen
每個頂點 V 附帶着紋理對(s,t)和一個頂點法向 n。頂點通過模式視點矩陣變換,產生視點座標系下的頂點 A 和法向 n’。計算着色時使用這個法向,產生顏色 c。頂點經過透視變換,產生 a~ =(a1,a2,a3,a4),紋理座標和顏色 c 並沒有改變。(裁剪後的點加上一個1計算出來的 1/a4 在計算雙線性插值時使用)