C++中用運算符重載實現矩陣運算_第1頁
C++中用運算符重載實現矩陣運算_第2頁
C++中用運算符重載實現矩陣運算_第3頁
C++中用運算符重載實現矩陣運算_第4頁
C++中用運算符重載實現矩陣運算_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、走進3D的世界- C+中用運算符重載實現矩陣運算 周軍矩陣(Matrix)無處不在,我們的生活中到處都能找到矩陣的身影,然而此處我不想把這個定義放大,我們只討論線性代數中的矩陣,我們要用它們來完成我們的3D變換。為什么矩陣可以完成3D變換呢?下面,我們就來介紹矩陣是如何變換坐標的:設空間中有一坐標(x,y,z),如果我們想把它變換成另一坐標(x,y,z),我們可以進行如下操作:= (x,y,z,1)這就是矩陣的妙用了。它在復雜處理變換的時候表現得尤為突出。假設我們想要把一個物體先沿z軸旋轉角thetaZ,再沿x軸旋轉角thetaX,我們可以進行如下操作(pseudo-code):obj*=ro

2、tX(thetaX)*rotZ(thetaZ);注意:矩陣的乘法是不可逆的,而且我們要按變化順序的逆序進行乘法,具體推導見計算幾何相關書籍。下面,我們進入正題:如何再C+中用重載運算符的方法來進行矩陣運算以完成線性變換呢?我們需要變換坐標,所以很自然地,我們需要一個向量(Vector)類;同時我們要進行線性變換,需要進行矩陣運算,所以我們還需要一個矩陣(Matrix)類。為了使我們的運算更為直觀、人性化,我選用了運算符重載這以技巧而不是簡單地調用函數,下面請看我的具體實現:以上便是CVector類的具體實現,我想對C+和線性代數有所了解的讀者都能很清楚地理解這段代碼,在次不累述。上述代碼的成員

3、函數實在類外定義的,如果讀者在實踐中為了提高速度可以把這些成員函數定義在類內以起到內聯函數的作用,可以省去參數壓棧、出棧時的時間。下面是CMatrix類的具體實現:是不是也很好理解呢?哈哈,這就是用運算符重載的好處。不過這種方法也確實有它的不足,而且這個不足在游戲編程中是致命的,那就是效率不高,這也正是為什么Microsoft在DirectX中也使用難看的一般函數調用來完成矩陣運算的原因。影響速度的主要原因是在使用運算符+、-、*、/等時,程序會在每次運算時創(chuàng)建臨時對象再將臨時對象返回,對于重復多次的矩陣運算來說,這無疑成為了一筆龐大的額外開銷好在現在的電腦的處理速度還算快。但注意:在使用+=

4、、-=、*=、/=時不會有上述問題,因為在使用這些運算符時程序只需要修改第一個對象不需要創(chuàng)建并返回臨時對象。所以在能使用+=、-=、*=、/=時盡量不要使用單一的=、-、*、/運算符。好了,這兩個類我們已經封裝好了,下面還有什么呢?是的,忘了向大家交代旋轉矩陣了: 這三個就是再前面出現過的rotX、rotY、rotZ了,這些都是由數學家推導出來的,至于具體怎么推導向量法,有興趣的朋友可以參考計算幾何相關書籍。這篇文章到這里似乎應該結束了,不知道我是不是講清楚了,嘿嘿 _還是按照慣例附上兩個例子吧,都是旋轉3D物體的例子,物體是由一些點隨機生成的,具體運行效果見下列圖:圖1. 3D物體的旋轉例子操作說明: 上、下鍵:使物體沿x軸旋轉 左、右鍵:使物體沿y軸旋轉 Delete、PageDown鍵:使物體沿z軸旋轉 Home、End鍵:改變物體距視點的距離 移動鼠標:物體可以隨鼠標的運動而運動還記得,在上一篇粒子系統(tǒng)的應用中,我提到過利用粒子系統(tǒng)可以模擬一些特殊的光影效果,但是我當時并沒有附上例子,因為它要用到矩陣變換的一些知識,所以現在我把這個例子附上。其中包括一些放縮、模糊等技巧我會在以后的文章中涉及。具體運行效果見下列圖:圖 2. 光影效果模擬很眩吧,哈哈!文章

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論