前言(Preface) 前段時(shí)間有些朋友在論壇里問到一些關(guān)于3D數(shù)學(xué)的知識(shí),,就想為大家寫點(diǎn)這方面的文章。由于之前比較忙,,又遇到過春節(jié),,所以最近才著筆寫了這篇文章,希望大家喜歡,。這些內(nèi)容主要是一些理論知識(shí),,看上去難免有些枯燥,之后的文章我會(huì)加入一些實(shí)例進(jìn)行講解的,。如果內(nèi)容存在錯(cuò)誤和不全,,就請(qǐng)你來更正和添加了。
三維坐標(biāo)系(3D Coordinate System) 三維坐標(biāo)是把二維的平面坐標(biāo)推廣到三維空間中,,在三維坐標(biāo)中,,點(diǎn)(x,y,z)的齊次坐標(biāo)為(nx,ny,nz,n),其中n為任意不為0的數(shù),,規(guī)范化的齊次坐標(biāo)為(x,y,z,1),,與之相對(duì)應(yīng),三維變換的變換矩陣為4×4矩陣,。 在三維空間中,,我們通常使用右手坐標(biāo)系(Right-Handed Coordinate System),因?yàn)樗蠑?shù)學(xué)上的習(xí)慣,,而在計(jì)算機(jī)圖形學(xué)中,,我們會(huì)使用左手坐標(biāo)系(Left-Handed Coordinate System),因?yàn)樗容^符合日常習(xí)慣,。其實(shí),,我們可以任意的旋轉(zhuǎn)這些坐標(biāo)系,而圖形仍然保持不變,。常見的坐標(biāo)系如下: 屏幕坐標(biāo)系:相對(duì)于顯示器的原點(diǎn)的2D坐標(biāo)系 本地坐標(biāo)系:相對(duì)于對(duì)象的原點(diǎn)的3D坐標(biāo)系 世界坐標(biāo)系:相對(duì)于3D世界的原點(diǎn)三維坐標(biāo)系 對(duì)齊(視點(diǎn))坐標(biāo)系:世界坐標(biāo)系的變換,,觀察者的位置在世界坐標(biāo)系的原點(diǎn),。
點(diǎn)(Point) 點(diǎn)是在某一個(gè)坐標(biāo)系中使用坐標(biāo)值指定的位置。因此,,點(diǎn)到坐標(biāo)原點(diǎn)之間的距離與坐標(biāo)系的選擇有關(guān),。點(diǎn)P在坐標(biāo)系A(chǔ)中的坐標(biāo)為(0,0,0),而在坐標(biāo)系B中的坐標(biāo)則為(x,y,z),。
向量(Vector) 向量是指兩點(diǎn)的差值,,具有大小和方向,即給定兩點(diǎn),,就能唯一確定一個(gè)向量,,向量的大小和方向與坐標(biāo)系的選擇無關(guān)。向量V=(Vx,Vy,Vz)=P1P2=(x2-x1,y2-y1,z2-z1)其中,,Vx,,Vy和Vz分別為向量V在x,y和z軸上的投影,,稱為向量V的x分量(x component),,y分量(y component)和z分量(z component)。該向量的大小為: 向量V與x,,y和z軸形成的方向角(Direction Angle):α,,β和γ,其中cosα,,cosβ和cosγ稱為方向余弦(Direction Cosine),。 向量加法:V1+V2=(V1x+V2x,V1y+V2y,V1z+V2z) 向量標(biāo)量乘:aA=(aVx,aVy,aVz) 向量標(biāo)量積:V1·V2= V1x+V2x,V1y+V2y,V1z+V2z 向量積(*積):V1×V2=(V1yV2z-V1zV1y,V1zV2x-V1xV2z,V1xV2y-V1yV2z) =|Ux Uy Uz| |V1x V1y V1z| |V2x V2y V2z| 注:其中Ux,Uy,Uz分別表示沿x軸,y軸和z軸的單位向量,。在以后的編程中,,我們經(jīng)常會(huì)用到向量積。
矩陣(Matrix) 矩陣是由若干個(gè)數(shù)值構(gòu)成的矩形陣列,,這些數(shù)值通常為實(shí)數(shù),,稱為矩陣的元素。如果一個(gè)矩陣的行和列數(shù)相同,,我們則稱該矩陣為方陣(Square Matrix),,而只有一行或者一列的矩陣用常用向量表示,例如:[x,y,z]稱為行向量(Row Vector),, |x| |y| 則稱為列向量(Colume Vector),。 |z|
矩陣加法:|A11 A12 A13| |B11 B12 B13| | A11+ B11 A12+ B12 A13+ B13| |A21 A22 A23| + |B21 B22 B23| = | A21+ B21 A22+ B22 A23+ B23| |A31 A32 A33| |B31 B32 B33| | A31+ B31 A32+ B32 A33+ B33|
矩陣標(biāo)量乘: |A11 A12 A13| |nA11 nA12 nA13| n |A21 A22 A23| = |nA21 nA22 nA23| |A31 A32 A33| |nA31 nA32 nA33|
矩陣變換(Matrix Transform) 三維平移的矩陣表示為: [x`,y`,z`,1]=[x,y,z,1] | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | tx ty tz 1 |
三維縮放的矩陣表示為: [x`,y`,z`,1]=[x,y,z,1] | sz 0 0 0 | | 0 sy 0 0 | | 0 0 sx 0 | | 0 0 0 1 |
繞x軸旋轉(zhuǎn)的矩陣表示為: [x`,y`,z`,1]=[x,y,z,1] | 1 0 0 0 | | 0 cosα sinα 0 | | 0 -sinα cosα 0 | | 0 0 0 1 |
繞y軸旋轉(zhuǎn)的矩陣表示為: [x`,y`,z`,1]=[x,y,z,1] | cosα 0 -sinα 0 | | 0 1 0 0 | | sinα 0 cosα 0 | | 0 0 0 1 |
繞z軸旋轉(zhuǎn)的矩陣表示為: [x`,y`,z`,1]=[x,y,z,1] | cosα sinα 0 0 | | -sinα cosα 0 0 | | 0 0 1 0 | | 0 0 0 1 |
反射(Reflection) 反射變換也稱為對(duì)稱(Symmetric)變換或鏡像(Mirror Image)變換,三維反射變換可以相對(duì)于反射軸(Reflection Axis)進(jìn)行,,也可以相對(duì)于反射平面進(jìn)行,。相對(duì)于反射軸的三維反射變換是通過將圖形繞反射軸旋轉(zhuǎn)180°來實(shí)現(xiàn)的。 相對(duì)于xy平面的反射變換矩陣為: | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 0 1 |
相對(duì)于yz平面的反射變換矩陣為: |-1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 0 1 |
相對(duì)于zx平面的反射變換矩陣為: | 1 0 0 0 | | 0 -1 0 0 | | 0 0 1 0 | | 0 0 0 1 |
錯(cuò)切(Shear) 錯(cuò)切變換會(huì)改變圖形的形狀。 相對(duì)于x軸的錯(cuò)切變換矩陣為: | 1 0 0 0 | | shY 1 0 0 | | shz 0 1 0 | | 0 0 0 1 |
相對(duì)于y軸的錯(cuò)切變換矩陣為: | 1 shX 0 0 | | 0 1 0 0 | | 0 shz 1 0 | | 0 0 0 1 |
相對(duì)于z軸的錯(cuò)切變換矩陣為: | 1 0 shX 0 | | 0 1 shY 0 | | 0 0 1 0 | | 0 0 0 1 |
從簡(jiǎn)單的平移,、縮放和旋轉(zhuǎn)等可以延伸到復(fù)合平移,、復(fù)合縮放,、復(fù)合旋轉(zhuǎn),、固定點(diǎn)縮放等概念,這些就要*讀者自己查閱資料了,,在這里我就不多講了,。
三維轉(zhuǎn)換(3D Transform) 最常見的轉(zhuǎn)換有以下三種類型: 1、世界坐標(biāo)系轉(zhuǎn)換:通過這種轉(zhuǎn)換方式,,可以改變3D物體的位置,、大小、角度等等,。就是改變3D世界中的物體位置相關(guān)的特性,; 2、透視轉(zhuǎn)換:透視轉(zhuǎn)換決定了三維場(chǎng)景如何透視到二維平面上,。包括觀察三維世界攝象機(jī)鏡頭的觀察范圍等屬性,; 3、觀察坐標(biāo)系轉(zhuǎn)換:這種轉(zhuǎn)換方式?jīng)Q定了三維世界中觀察者的位置,,觀察方向等屬性,。
投影變換(Projection Transformation) 投影變換就是將維數(shù)為n的點(diǎn)變換成維數(shù)小于n的點(diǎn)。我們會(huì)用到的就是將三維空間中的點(diǎn)變換成二維平面上的點(diǎn),。要對(duì)三維物體進(jìn)行投影變換,,首先要在三維空間中選擇一個(gè)點(diǎn),稱為投影中心(Center of Projection),;再定義一個(gè)不經(jīng)過投影中心的平面,,稱為投影平面(Projection Plane);從投影中心向物體的沒一點(diǎn)引射線,,這些射線稱為投影線(Projection Ray),,投影線與投影平面的交點(diǎn)集合就稱為三維物體在二維投影平面上的投影。 投影可以分為兩大類,,即透視投影(Perspective Projection)和平行投影(Parallel Projection),;如果投影中心到投影平面的距離是有限的,那么投影線是從投影中心發(fā)出的無數(shù)條射線,,這種投影稱為透視投影,;如果投影中心到投影平面的距離越來越遠(yuǎn),那么投影線就越來越趨于平行,,當(dāng)投影中心到投影平面的距離為無窮遠(yuǎn)的時(shí)候,,投影線為一組平行線,這種投影稱為平行投影。
透視投影(Perspective Projection) 設(shè)投影中心為PC(XC,,YC,,ZC),投影平面為Z=ZP平面(ZP≠ZC),,即投影平面平行與xy平面(垂直于z軸)并且不經(jīng)過投影中心,,三維空間中的點(diǎn)P(x,y,z)在投影平面上的透視投影為點(diǎn)PP(XP,YP,,ZP),。 則透視投影矩陣為: |ZP-ZC 0 XC -XCZP | | 0 ZP-ZC YC -YCZP | | 0 0 ZP -ZCZP | | 0 0 1 -ZC |
如果投影中心PC在坐標(biāo)原點(diǎn),投影平面仍然是Z=ZP平面,,即XC=YC=ZC=0,,那么透視投影矩陣變成: | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 1/zP 0 |
如果投影中心PC在z軸上,投影平面是xy平面,,即XC=YC=0,,那么透視投影矩陣變成: | 1 0 0 0 | | 0 1 0 0 | | 0 0 0 0 | | 0 0 -1/zP 1 |
對(duì)于三維空間中任意一組平行線來說,如果它們平行于投影平面,,那么它們的透視投影仍然保持平行,;如果他們不平行于投影平面,那么它們的透視投影不再保持平行,,并且會(huì)匯聚到一個(gè)點(diǎn),,該點(diǎn)稱為滅點(diǎn)(Vanishing Point);平行于坐標(biāo)軸的一組平行線形成的滅點(diǎn)稱為主滅點(diǎn)(Principal Vanishing Point)或軸滅點(diǎn)(Axis Vanishing Point),。透視投影的主滅點(diǎn)的數(shù)目等于與投影平面相交的坐標(biāo)軸的數(shù)目,,而三維空間中的任意投影平面最少與一個(gè)坐標(biāo)軸相交,最多與x,y,z三個(gè)坐標(biāo)軸都相交,,所以主滅點(diǎn)的數(shù)目最少為1個(gè),,最多為3個(gè)。根據(jù)主滅點(diǎn)的數(shù)目,,我們可以將透視投影分為三類,,即一點(diǎn)透視、二點(diǎn)透視和三點(diǎn)透視,。 如果投影平面只與一個(gè)坐標(biāo)軸相交,,與另外兩個(gè)坐標(biāo)軸平行,那么透視投影只形成一個(gè)主滅點(diǎn),,稱為一點(diǎn)透視,。
如果投影平面與兩個(gè)坐標(biāo)軸相交,與剩下的一個(gè)坐標(biāo)軸平行,,那么透視投影形成兩個(gè)主滅點(diǎn),,稱為二點(diǎn)透視。二點(diǎn)透視比一點(diǎn)透視具有更強(qiáng)的真實(shí)感,被廣泛地應(yīng)用于建筑,、工程,、廣告等領(lǐng)域。
平行投影(Parallel Projection) 根據(jù)投影方向的不同,,我們可以把平行投影分為兩類:如果投影方向與投影平面垂直,,既投影方向與投影平面法向量的方向相同,那么這種投影稱為正平行投影(Orthographic Parallel Projection),,簡(jiǎn)稱為正投影,;如果投影方向與投影平面斜交,那么這種投影稱為斜平行投影(Ohlique Parallel Projection),,簡(jiǎn)稱為斜投影。 1,、 正投影 正投影經(jīng)常用于產(chǎn)生物體的三視圖,。因?yàn)槿晥D能準(zhǔn)確地反映物體的長(zhǎng)度和角度。三視圖是指投影方向分別取作x軸,、y軸和z軸方向,,投影平面分別垂直于x軸、y軸和z軸事的正投影,,產(chǎn)生的視圖分別成為前視圖(Front View),、側(cè)視圖(Side View)和頂視圖(Top View)。產(chǎn)生三視圖的投影矩陣分別為: Mfront= | 0 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 0 1 |
Mside= | 1 0 0 0 | | 0 0 0 0 | | 0 0 1 0 | | 0 0 0 1 |
Mtop= | 1 0 0 0 | | 0 1 0 0 | | 0 0 0 0 | | 0 0 0 1 | 當(dāng)投影方向不取坐標(biāo)軸方向,,投影平面不垂直于坐標(biāo)軸時(shí),,產(chǎn)生的正投影稱為軸測(cè)正投影(Axonometric Orthographic Projection)。軸測(cè)正投影又分為正等測(cè)(Isimetric Projection),、正二測(cè)和正三測(cè)三種,。當(dāng)投影平面與三個(gè)坐標(biāo)軸的交點(diǎn)到坐標(biāo)原點(diǎn)的距離都相等時(shí)為正等測(cè),也稱為等軸測(cè),;當(dāng)投影平面與兩個(gè)坐標(biāo)軸的交點(diǎn)到坐標(biāo)原點(diǎn)的距離相等時(shí)為正二測(cè),;當(dāng)投影平面與三個(gè)坐標(biāo)軸的交點(diǎn)到坐標(biāo)原點(diǎn)的距離都不相等時(shí)為正三測(cè)。 在這三種軸測(cè)正投影中,,正等測(cè)應(yīng)用最為廣泛,。由于正等測(cè)的投影平面與三個(gè)坐標(biāo)軸的焦點(diǎn)到坐標(biāo)原點(diǎn)的距離都相等,因此投影方向(即投影平面的法向量)與三個(gè)坐標(biāo)軸的夾角也相等,。
2,、 斜投影 投影方向與投影平面斜交的平行投影稱為斜投影。假設(shè)投影平面為Z=ZP平面,,投影方向?yàn)椋╔D,YD,ZD)(ZD≠0),,三維空間中的點(diǎn)P(x,y,z)在投影平面上的斜投影為點(diǎn)PP(xP,yP,zP),。則斜投影矩陣為: | ZD 0 -XD XDZP | | 0 ZD -YD YDZP | | 0 0 0 ZDZP | | 0 0 0 ZD | 如果投影平面為z=0平面,,即ZP=0,那么斜投影矩陣變成: | 1 0 -XD/ZD 0 | | 0 1 -YD/ZD 0 | | 0 0 0 0 | | 0 0 0 1 |
總結(jié)(Conclusion) 上面所提到的知識(shí),,都是我們平時(shí)編程時(shí)經(jīng)常會(huì)用到的,,可能還有些知識(shí)沒提到,只好*自己翻翻線形代數(shù)書了,。如果對(duì)上面知識(shí)有什么不懂的和錯(cuò)誤的,,可以跟我討論。如果你有基礎(chǔ)知識(shí),,把這些理論用于實(shí)踐應(yīng)該是很輕松的事,,如果你沒有基礎(chǔ)知識(shí),也沒什么大不了的,,可以先看看關(guān)于OpenGL的書入門,。這樣上手會(huì)快一些。另外,,上面的內(nèi)存可能存在一些格式問題,,請(qǐng)大家諒解。 |
|