




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、走進(jìn)3D的世界- C+中用運(yùn)算符重載實(shí)現(xiàn)矩陣運(yùn)算 周軍矩陣(Matrix)無處不在,我們的生活中到處都能找到矩陣的身影,然而此處我不想把這個(gè)定義放大,我們只討論線性代數(shù)中的矩陣,我們要用它們來完成我們的3D變換。為什么矩陣可以完成3D變換呢?下面,我們就來介紹矩陣是如何變換坐標(biāo)的:設(shè)空間中有一坐標(biāo)(x,y,z),如果我們想把它變換成另一坐標(biāo)(x,y,z),我們可以進(jìn)行如下操作:= (x,y,z,1)這就是矩陣的妙用了。它在復(fù)雜處理變換的時(shí)候表現(xiàn)得尤為突出。假設(shè)我們想要把一個(gè)物體先沿z軸旋轉(zhuǎn)角thetaZ,再沿x軸旋轉(zhuǎn)角thetaX,我們可以進(jìn)行如下操作(pseudo-code):obj*=ro
2、tX(thetaX)*rotZ(thetaZ);注意:矩陣的乘法是不可逆的,而且我們要按變化順序的逆序進(jìn)行乘法,具體推導(dǎo)見計(jì)算幾何相關(guān)書籍。下面,我們進(jìn)入正題:如何再C+中用重載運(yùn)算符的方法來進(jìn)行矩陣運(yùn)算以完成線性變換呢?我們需要變換坐標(biāo),所以很自然地,我們需要一個(gè)向量(Vector)類;同時(shí)我們要進(jìn)行線性變換,需要進(jìn)行矩陣運(yùn)算,所以我們還需要一個(gè)矩陣(Matrix)類。為了使我們的運(yùn)算更為直觀、人性化,我選用了運(yùn)算符重載這以技巧而不是簡(jiǎn)單地調(diào)用函數(shù),下面請(qǐng)看我的具體實(shí)現(xiàn):以上便是CVector類的具體實(shí)現(xiàn),我想對(duì)C+和線性代數(shù)有所了解的讀者都能很清楚地理解這段代碼,在次不累述。上述代碼的成員
3、函數(shù)實(shí)在類外定義的,如果讀者在實(shí)踐中為了提高速度可以把這些成員函數(shù)定義在類內(nèi)以起到內(nèi)聯(lián)函數(shù)的作用,可以省去參數(shù)壓棧、出棧時(shí)的時(shí)間。下面是CMatrix類的具體實(shí)現(xiàn):是不是也很好理解呢?哈哈,這就是用運(yùn)算符重載的好處。不過這種方法也確實(shí)有它的不足,而且這個(gè)不足在游戲編程中是致命的,那就是效率不高,這也正是為什么Microsoft在DirectX中也使用難看的一般函數(shù)調(diào)用來完成矩陣運(yùn)算的原因。影響速度的主要原因是在使用運(yùn)算符+、-、*、/等時(shí),程序會(huì)在每次運(yùn)算時(shí)創(chuàng)建臨時(shí)對(duì)象再將臨時(shí)對(duì)象返回,對(duì)于重復(fù)多次的矩陣運(yùn)算來說,這無疑成為了一筆龐大的額外開銷好在現(xiàn)在的電腦的處理速度還算快。但注意:在使用+=
4、、-=、*=、/=時(shí)不會(huì)有上述問題,因?yàn)樵谑褂眠@些運(yùn)算符時(shí)程序只需要修改第一個(gè)對(duì)象不需要?jiǎng)?chuàng)建并返回臨時(shí)對(duì)象。所以在能使用+=、-=、*=、/=時(shí)盡量不要使用單一的=、-、*、/運(yùn)算符。好了,這兩個(gè)類我們已經(jīng)封裝好了,下面還有什么呢?是的,忘了向大家交代旋轉(zhuǎn)矩陣了: 這三個(gè)就是再前面出現(xiàn)過的rotX、rotY、rotZ了,這些都是由數(shù)學(xué)家推導(dǎo)出來的,至于具體怎么推導(dǎo)向量法,有興趣的朋友可以參考計(jì)算幾何相關(guān)書籍。這篇文章到這里似乎應(yīng)該結(jié)束了,不知道我是不是講清楚了,嘿嘿 _還是按照慣例附上兩個(gè)例子吧,都是旋轉(zhuǎn)3D物體的例子,物體是由一些點(diǎn)隨機(jī)生成的,具體運(yùn)行效果見下列圖:圖1. 3D物體的旋轉(zhuǎn)例子操作說明: 上、下鍵:使物體沿x軸旋轉(zhuǎn) 左、右鍵:使物體沿y軸旋轉(zhuǎn) Delete、PageDown鍵:使物體沿z軸旋轉(zhuǎn) Home、End鍵:改變物體距視點(diǎn)的距離 移動(dòng)鼠標(biāo):物體可以隨鼠標(biāo)的運(yùn)動(dòng)而運(yùn)動(dòng)還記得,在上一篇粒子系統(tǒng)的應(yīng)用中,我提到過利用粒子系統(tǒng)可以模擬一些特殊的光影效果,但是我當(dāng)時(shí)并沒有附上例子,因?yàn)樗玫骄仃囎儞Q的一些知識(shí),所以現(xiàn)在我把這個(gè)例子附上。其中包括一些放縮、模糊等技巧我會(huì)在以后的文章中涉及。具體運(yùn)行效果見下列圖:圖 2. 光影效果模擬很眩吧,哈哈!文章
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人財(cái)產(chǎn)安全設(shè)備銷售與租賃合同
- 外墻保溫裝飾一體板施工合同
- 學(xué)校專家聘用合同
- 關(guān)于提高工作效率的溝通機(jī)制研究報(bào)告
- 鄉(xiāng)村發(fā)展行動(dòng)指導(dǎo)書
- 制造業(yè)企業(yè)數(shù)字化轉(zhuǎn)型實(shí)施方案
- 核電安全施工方案模板
- 籃球場(chǎng)工程施工方案
- 河南電力電纜線槽施工方案
- 建筑工程切險(xiǎn)保險(xiǎn)合同
- 雨污分流管網(wǎng)改造工程施工方案及方法
- G基站審批一件事流程圖
- 《零基礎(chǔ)玩轉(zhuǎn)小紅書:吃透爆款邏輯漲粉、變現(xiàn)不再難》
- 下肢動(dòng)脈硬化閉塞癥診治指南解讀完整版專家講座
- 圍術(shù)期下肢深靜脈血栓預(yù)防的術(shù)中護(hù)理
- 青島版四年級(jí)下冊(cè)口算題1000題(可打印)
- C20片石混凝土擋土墻施工方案
- GB/T 12996-2012電動(dòng)輪椅車
- 11471勞動(dòng)爭(zhēng)議處理(第7章)
- 三維動(dòng)畫設(shè)計(jì)與制作習(xí)題
- 幼兒園媽媽的禮物x繪本課件
評(píng)論
0/150
提交評(píng)論