最近工作比較忙,好長時間沒更新了,今天得閒,再來一篇。
我們拿太陽系為模型,主要實現太陽自轉、地球自轉、地球公轉、月球自轉、月球公轉效果。由於現在還沒有說到模型的繪製,我們現在暫時用正方體來代表三個星球。
先來看一下,在direct3d中是如何生成平移、旋轉、縮放矩陣的。
1、生成平移矩陣:
c#
1
2
d3dxmatrix
*winapi
d3dxmatrixtranslation
(d3dxmatrix
*pout
,floatx,
floaty,
floatz)
; pout是最終生成的平移矩陣指標,x、y、z分別表示各方向上的移動量。
2、生成旋轉矩陣:
c#
1
2
3
4
5
6
d3dxmatrix
*winapi
d3dxmatrixrotationx
(d3dxmatrix
*pout
,float
angle);
d3dxmatrix
*winapi
d3dxmatrixrotationy
(d3dxmatrix
*pout
,float
angle);
d3dxmatrix
*winapi
d3dxmatrixrotationz
(d3dxmatrix
*pout
,float
angle);
這三個函式分別生成繞x、y、z軸旋轉的旋轉矩陣。其中pout是生成的旋轉矩陣指標,angle為旋轉的角度。
3、生成縮放矩陣:
c#
1
2
d3dxmatrix
*winapi
d3dxmatrixscaling
(d3dxmatrix
*pout
,floatsx,
floatsy,
floatsz)
; pout為生成的縮放矩陣指標,sx、sy、sz分別為在三個座標軸上的縮放係數。同設定不同的縮放係數可以實現一些特殊效果。
將要實現的簡單太陽系就是通過這一系列的有序組合實現的。我們分別為太陽、地球、月球進行設定。
設定太陽:
c#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void
setsunmatrix()
在此方法中首先進行了世界變換,也就是我們的太陽自轉操作,然後是觀察、投影的變換。在宣告乙個矩陣後,呼叫函式d3dxmatrixidentity在將矩陣轉換為單位矩陣(矩陣左上角到右下角這條對角線上的值為1,其他值為0的矩陣)以防止意外操作產生的不利影響。在世界變換中實現太陽的自轉此處設定y軸為太陽中心軸,角速度由系統時間得出。設定觀察變換,主要需要三個向量:眼睛的位置、所觀察的位置、眼睛擺放向上方向。
c#
1
2
3
d3dxmatrix
*winapi
d3dxmatrixlookatlh
(d3dxmatrix
*pout
,const
d3dxvector3
*peye
,const
d3dxvector3
*pat,
const
d3dxvector3
*pup);
此方法生成觀察變換矩陣(此處為左手座標系),pout為生成的觀察矩陣指標,peye為眼睛的擺放位置指標,pat為觀察的點的指標,pup為眼睛擺放的向上方向指標。
c#
1
2
d3dxmatrix
*winapi
d3dxmatrixperspectivefovlh
(d3dxmatrix
*pout
,float
fovy
,float
aspect
,floatzn,
floatzf)
; 此方法生成投影變換矩陣(此處為左手座標系),pout為生成的投影變換矩陣指標,fovy為在y軸方向看到的最大範圍(弧度),aspect為視區寬度與高度的比例,zn為近裁剪面的z值,zf為遠裁剪面的z值,這樣就形成乙個近小遠大的台體,我們所看到的一切就都在這個台體中。
設定地球:
c#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void
setearthmatrix()
設定月球:
c#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void
setmoonmatrix()
對地球和月球的設定,主要注意各種矩陣變換的順序,在這裡,矩陣變換的組合操作由矩陣相乘得到,操作的順序由左向右,需要清楚的一點事,矩陣相乘不支援交換律。當然也可以使用函式d3dxmatrixmultiply數做乘法運算,原型如下:
c#
1
2
d3dxmatrix
*winapi
d3dxmatrixmultiply
(d3dxmatrix
*pout
,const
d3dxmatrix
*pm1
,const
d3dxmatrix
*pm2);
pout為得到的矩陣指標,pm1、pm2為待處理矩陣,兩者按順序相乘(本人比較喜歡使用a*b的形式,書寫起來更方便一些)。
然後說一下視區變換,
c#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void
setviewport()
視區變換通過函式setviewport實現,它只有乙個引數,就是乙個d3dviewport9結構體的指標,d3dviewport9中的屬性含義:x為視區左上角x座標,y為視區左上角y座標,width為視區的寬度,height為視區的高度,minz為視區內物體的最小深度值,maxz為視區內物體的最大深度值。
在繪製圖形的時候,要先執行變換操作,再進行繪製。
執行程式,我們將看到如圖效果:
好,到這裡,簡單的太陽系就做好了。
zxgoto祝大家程式設計愉快
3D基礎 3D座標變換在OpenGL 中的實踐
在計算機圖形學中,變換矩陣是非常基礎也是非常重要的知識,在許多資料中,只是羅列出一堆矩陣公式,圖表等等,這很難給人感性的認識,特別是初學者,筆者結合 opengl 這樣乙個非常流行的圖形庫,以實踐的方式闡述在 3d變換矩陣中最簡單的三種 平移 縮放以及旋轉。這裡有一些前提知識,就是需要了解線性代數一...
原 3D中的座標變換(一)
相機變換 1.建立乙個尤拉相機模型的過程 i 計算出相機的平移矩陣 根據相機位置計算平移矩陣的逆矩陣 ii 根據相機沿各個座標軸的變化角度,計算一下各座標軸的尤拉角度。iii 然後建立各座標軸的旋轉的逆矩陣。左後根據座標軸的變換順序,如 xyz yxz xzy yzx zyx等旋轉順序,產生乙個計算...
3D空間變換
它相當於是平移變換 t 和旋轉變換 r 的復合,等距變換前後長度,面積,線線之間的角度都不變。自由度 6 旋轉變換r自由度 3,平移變換t自由度 3 t rt0t 1 t begin r t 0 t 1 end t r0t t1 4x4矩陣 eigen isometry3d eigen isomet...