3D座標變換之自轉公轉

2021-07-01 23:51:01 字數 4812 閱讀 2808

最近工作比較忙,好長時間沒更新了,今天得閒,再來一篇。

我們拿太陽系為模型,主要實現太陽自轉、地球自轉、地球公轉、月球自轉、月球公轉效果。由於現在還沒有說到模型的繪製,我們現在暫時用正方體來代表三個星球。

先來看一下,在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...