(一)世界座標係向觀察座標系的轉換
假如任何形體都放在世界座標系中,那麼計算是相當複雜的,為了簡化計算,我們需要把形體從世界座標系轉到觀察座標系中。觀察座標系的原點在是世界座標系的位置為eye,z軸與觀察方向一致(從eye出發到at點的向量)如圖4-1所示:
圖4-1
假設觀察座標系的座標軸分別以單位向量xaxis,yaxis,zaxis,則:
xaxis= normal (at-eye);
yaxis= normal (cross(up,zaxis));
zaxis= normal (zaxis,xaxis);
假設世界座標系中任意一點p的座標(x,y,z),在觀察座標系中的座標(x',y',z')。
x' = (p-eye)* xaxis = x*xaxis.x + y* xaxis.y + z * xaxis.z - xaxis*eye
y' = (p- eye)*yaxis = x*yaxis.x + y* yaxis.y + z * yaxis.z - yaxis*eye
z'= (p- eye)*zaxis = x*zaxis.x + y* zaxis.y + z * zaxis.z - zaxis*eye
(x',y',z',1) = (x,y,z,1)*
所以從世界座標係向觀察座標系變換的矩陣為
(二)齊次裁剪透視投影變換
真實的物體是三維的,但是計算機螢幕是二維的,必須把三維物體投影到螢幕平面上,而且還要儲存深度資訊,這個變換過程稱為投影變換,如圖4-2所示
圖4-2
假設視截體y方向的張角fov,近平面zn,遠平面的zf,近平面的寬高比aspect,現在可以直到近平面的方程z=zn,遠平面 z=zf。
圖4-3
由圖4-3可以看出,視截體的頂面方程為y=z*tan(fov/2);底面方程=-z*tan(fov/2);視截體的右側面x=cot(fov/2)*aspect*z.
左側面方程x=-cot(fov/2)*aspect*z.
首先尋求把頂面y = z*tan(fov/2) 轉換為y'=1,y'=k*y ,k=cot(fov/2)*y/z就是滿足條件的變換,底面變換也是這個表示式。
右側面x = cot(fov/2)*aspect*z,轉換為x'=1, x'=p*x, 從而p=(tan(fov/2)/aspect)/z(左側面表示式相同).
最後尋求把近平面zn轉換為z'=0;zf轉換為z'=1. z'= r*z + s.於是r* zn + s =0,r*zf + s =1,由此求出 r= /(zf-zn), s= -zn/(af-zn).
透視投影變換矩陣=
(三)視截體平面的計算
根據模型變換矩陣和投影變換矩陣,可以計算出視截體的6個平面。世界座標系中的視截體在模型變換和透視投影變換後,成為觀察座標系中的[-1,1]*[-1,1]*[0,1]。設模型變換a,投影變換b,m=a*b,視截體的方程:ax+by+cz+d=0。該平面在觀察座標系中的形式為a'x'+b'y'+c'z'+d'=0.
(x',y',z',1) = (x,y,z,1)m
(x,y,z,1)(a,b,c,d)(轉置)=0
(x',y',z',1)(a',b',c',d')(轉置) = 0
可得:(x,y,z,1)m(a',b',c',d')(轉置) = 0
(a,b,c,d)(轉置)= m (a',b',c',d')**置)
a=m11a'+m12b'+m13c'+m14d'
b=m21a'+m22b'+m23c'+m24d'
c=m31a'+m32b'+m33c'+m34d'
d=m41a'+m42b'+m43c'+m44d'
視截體的6個平面的法向量均指向視截體內部,視截體的左側面leftplane 觀察座標系中的左側面x+1=0 ,代入上式可得視截體左側面的係數
a=m11+m14
b=m21+m24
c=m31+m34
d=m41+m44
右側面的方程1-x=0;係數
a=m14-m11
b=m24-m21
c=m34-m31
d=m44-m41
同理:頂面係數
a=m14-m12
b=m24-m22
c=m24-m32
d=m44-m42
底面係數
a=m12+m14
b=m22+m24
c=m32+m34
d=m42+m44
近平面係數:
a=m13
b=m23
c=m33
d=m43
遠平面係數:
a=m14-m13
b=m24-m23
c=m34-m33
d=m44-m43
上述內容是涉及視截體計算的數學基礎,下一節實戰視截體程式設計!
簡單快速的地形LOD連續變形
在地形渲染中為了減輕渲染負擔其中乙個技術是就lod,但其帶了的乙個問題就是會產生地形 跳動 因為地形的lod精度發生變化時鑲嵌的密度也發生了 變化。要解決這個問題有乙個方法就是當高精的模型向底精模型變化時不是突然變化過去的,而是慢慢漸變而來,這樣可以極大的減少 跳動 通過設定適當的漸 變距離可以做到...
基於四叉樹的LOD地形場景的怪異優化探索
基於四叉樹的lod地形場景是開發3d大規模場景地形乙個避不開的話題。小弟對此一直耿耿於懷。雖然說號稱自已學了幾年遊戲程式設計。但實際上真的還不會做四叉樹的lod地形。但眼下要麼就乾掉他,要麼就被他乾掉。所以,解決這個問題,實屬無奈。大概的看了一些資料,西里糊塗的。不過明確兩點 1。通過視野遠近調整近...
基於四叉樹的LOD地形場景的怪異優化探索
基於四叉樹的lod地形場景是開發3d大規模場景地形乙個避不開的話題。小弟對此一直耿耿於懷。雖然說號稱自已學了幾年遊戲程式設計。但實際上真的還不會做四叉樹的lod地形。但眼下要麼就乾掉他,要麼就被他乾掉。所以,解決這個問題,實屬無奈。大概的看了一些資料,西里糊塗的。不過明確兩點 1。通過視野遠近調整近...