1. 程式人生 > >3D數學--矩陣知識

3D數學--矩陣知識

本帖最後由 hunter_wwq 於 2013-7-24 14:04 編輯

開此貼是貼出自己在學如題所示知識點時所做的筆記,旨在跟我一樣菜的小朋友們共同學習探討一下這方面的知識,當然,絕對絕對歡迎大牛們來指點指教一下!!!

這是筆記附件:
 

下面也貼出筆記的內容,圖片和格式之類的我就不意義複製貼上過來了,太麻煩了,等下次把這塊知識都弄完了後再把格式改一下!
        任務
        瞭解矩陣相關的基礎知識
        掌握矩陣在3D中的具體應用
        清楚矩陣和逆矩陣各自的應用
        在osg中是如何進行矩陣運算的
1.        http://www.360doc.com/content/11/0906/15/7317486_146206322.shtml

2.        概念:方陣的行列式
>行列式與矩陣變換導致的尺寸改變相關,其中行列式的絕對值與面積(2D)、體積(3D)的改變相關,行列式的符號說明了變換矩陣是否包含映象或投影。
>矩陣的行列式還能對矩陣所代表的變換進行分類。如果矩陣的行列式為0,那麼該矩陣包含投影。如果矩陣的行列式為負,那麼該矩陣包含映象。

有關矩陣的行列式的概念:
>方陣M的行列式記作|M|或“det M”,非方陣矩陣的行列式是未定義的。
非方陣矩陣即行列長度不等的矩陣。
計算矩陣行列式的方法:
>將主對角線和反對角線上的元素各自相乘,然後用主對角線元素的積減去反對角線元素的積。
例:2X2階矩陣行列式的定義:

2X2階矩陣行列式計算示意圖:

3X3階矩陣行列式的定義:

3X3階矩陣行列式計算示意圖:

行列式的一些重要性之如下:

3.        概念:逆矩陣

矩陣求逆運算只能用於方陣。
並非所有的矩陣都有逆。
>方陣M的逆,記作M-1,也是一個矩陣。當M與M-1相乘時,結果是單位矩陣。
>奇異矩陣的行列式為0,非奇異矩陣的行列式不為0,所以檢測行列式的值是判斷 矩陣是否可逆的有效方法。
>對於任意可逆矩陣M,當且僅當v=0時,vM=0。
逆矩陣的重要性質如下:

>矩陣的逆在幾何上非常有用,因為它使得我們可以計算變換的”反向“或”相反“變換 ---- 能”撤銷“原變換的變換。所以,如果向量v用矩陣M來進行變換,接著用M的逆M-1進行變換,將會得到原向量。這很容易通過代數方法驗證:

逆矩陣可撤銷之前所做的變換。
4.        概念:餘子式、代數餘子式、標準伴隨矩陣
>餘子式是一個矩陣,而代數餘子式是一個標量。
>假設矩陣M有r行c列,記法M{ij}表示從M中除去第i行和第j列後剩下的矩陣。顯然,該矩陣有r-1行,c-1列,矩陣M{ij}稱作M的餘子式。
>對方陣M,給定行、列元素的代數餘子式等於相應餘子式的有符號行列式。
>從矩陣中任意選擇一行或一列,對該行或列中的每個元素,都乘以對應的代數餘子式。這些乘積的和就是矩陣的行列式。例如,任意選擇一行,如行i,行列式的計算過程如公式9.4所示:

例,重寫3X3矩陣的行列式:

>M的”標準伴隨矩陣“記作”adjM“,定義為M的代數餘子式矩陣的轉置矩陣。
例3X3階矩陣:

計算M的代數餘子式矩陣:

M的標準伴隨矩陣是M的待述餘子式矩陣的轉置:

>一旦有了標準伴隨矩陣,通過除以M的行列式,就能計算矩陣的逆。
>其表示如公式9.7所示:

5.        概念:正交矩陣

>正交矩陣對我們非常有用,因為很容易計算它的逆矩陣。
>很多情況下,我們可以提前知道矩陣是如何建立的,甚至瞭解矩陣是僅包含旋轉、映象呢,還是二者皆有(記住:旋轉和映象矩陣是正交的)。
>根據定義,當且僅當 M MT = I 時M是正交的。
>(1)當且僅當一個向量是單位向量時,它與自身的點積結果是1。
>(2)當且僅當兩個向量是互相垂直時,它們的點積為0。
>所以,若一個矩陣是正交的,它必須滿足下列條件:矩陣的每一行都是單位向量,矩陣的所有行互相垂直。
>如果M是正交的,則MT也是正交的。
當矩陣M為正交矩陣時,則該矩陣的逆矩陣為M的轉置矩陣。

矩陣正交化:
>構造一組正交基向量(矩陣的行)的標準演算法是施密特正交化。它的基本思想是,對每一行,從中減去它平行於已處理過的行的部分,最後得到垂直向量。
例,以3x3矩陣為例,和以前一樣,用r1、r2、r3代表3x3階矩陣M的行。正交向量組r1'、r2'、r3'的計算如公式9.9所示:

>現在r1'、r2'、r3'互相垂直了,它們是一組正交基。當然,它們不一定是單位向量。構造正交矩陣需要使用標準正交基,所以必須標準化這些向量。注意,如果一開始就進行標準化,而不是在第2步中做,就能避免所有除法了。
6.        概念:4D齊次空間
4D座標的基本思想:
>實際的3D點被認為是在4D中w=1"平面"上。4D點的形式為(x, y, z, w),將4D點投影到這個"平面"上得到相應的實際3D點(x/w, y/w, z/w)。w=0時4D點表示"無限遠點",它描述了一個方向而不是一個位置。
>在4D中,仍然可以用矩陣乘法來表達平移,如公式9.10所示,而在3D中是不可能的:

>記住,即使是在4D中,矩陣乘法仍然是線性變換。矩陣乘法不能表達4D中的"平移",4D零向量也將總是被變換成零向量。這個技巧之所以能在3D中 平移點是因為我們實際上是在切變4D空間。與實際3D空間相對應的4D中的"平面"並沒有穿過4D中的原點。因此,我們能通過切變4D空間來實現3D中的 平移。

#Q: 何為線性變換?

#Q: 位置矩陣P和轉換矩陣T的區別在哪?
#A: 對模型位置做變換,一定是P後乘T。
位置矩陣P:  
轉換矩陣T:  
轉換矩陣的最後一列一定為 
平移轉換矩陣的模板為: 
故對於轉換矩陣T,上邊3X3部分是旋轉/縮放部分,最下一行是平移部分。逆向利用這些資訊,能將任意4X4矩陣分解為線性變換部分和平移部分。將平移向量 記做t,將上邊3X3部分記做RS,則T可簡寫為:


>當一個形如[x, y, z, 0]的無窮遠點乘以一個包含旋轉、縮放等的變換矩陣,將會發生預期的變換。結果仍是一個無窮遠點,形式為[x, y, z, 0]。

一個無窮遠的點經過包含平移的變換後得到:

其結果和沒有平移的變換結果是一樣的!
>換句話說,4D向量中的w分量能夠"開關" 4x4 矩陣的平移部分。這個現象是非常有用的,因為有些向量代表“位置”,應當平移,而有些向量代表“方向”,如表面的法向量,不應該平移。從幾何意義上說,能將第一類資料當作"點",第二類資料當作"向量"。
>使用4x4矩陣的一個原因是4x4變換矩陣能包含平移。當我們僅為這個目的使用4x4矩陣時,矩陣的最後一列總是[0, 0, 0, 1]T。
7.        概念:一般仿射矩陣
通過4X4矩陣我們可以構造包含平移在內的一般仿射矩陣。例如:

8.        概念:透視投影
>正交投影也稱作平行投影,因為投影線都是平行的(投影線是指從原空間中的點到投影點的連線)。
>3D中的透視投影仍然是投影到2D平面上,但是投影線不再平行,實際上,它們相交於一點,該點稱作投影中心。
如圖所示:

>因為投影中心在投影平面前面,投影線到達平面之前已經相交,所以投影平面上的影象是翻轉的。當物體遠離投影中心時,正交投影仍保持不變,但透視投影變小了。
9.        概念已經理得差不多了,現在來做osg中的矩陣變換
大概有以下幾個概念需要理一下:
1)        矩陣與逆矩陣之間的互換
2)        矩陣與逆矩陣在三維中的應用
3)        有關旋轉\平移\縮放矩陣
4)        投影矩陣
10.        首先看osg::Matrix類
1)        平移相關方法
  1.                 // 獲得平移的向量
  2. inline Vec3d getTrans() const;
  3. // 將矩陣置為一個平移矩陣
  4. void makeTranslate( const Vec3d& v );
  5. // 生成一個平移矩陣,靜態函式
  6. inline static osg::Matrix translate( const Vec3d& v );
  7. // 前乘/後乘平移矩陣
  8. inline void preMultTranslate( const Vec3d& v );
  9. inline void postMultTranslate( const Vec3d& v );
  10. // 設定現有矩陣中的平移向量,即[3][0],[3][1],[3][2]
  11. void setTrans( const Vec3d& v );
  12. // 從現有矩陣中分離出平移向量,旋轉向量及縮放向量
  13. void decompose( osg::Vec3f& translation,
  14. osg::Quat& rotation,
  15. osg::Vec3f& scale,
  16. osg::Quat& so ) const;
複製程式碼 2)        透視投影的平截頭體相關方法
  1. // 採用平截體設定來建立一個透視投影矩陣
  2. inline static Matrixd frustum(double left,   double right,
  3.                                       double bottom, double top,
  4.                                       double zNear,  double zFar);
  5. // 獲取透視投影矩陣的平截體設定
  6. bool getFrustum(double& left,   double& right,
  7.                         double& bottom, double& top,
  8.                         double& zNear,  double& zFar) const;
複製程式碼 3)        透視投影相關方法
  1. // 獲取透視投影矩陣的相關引數
  2. bool getPerspective(double& fovy,  double& aspectRatio,
  3.                             double& zNear, double& zFar) const;
  4. // 將矩陣置為透視投影矩陣
  5. void makePerspective(double fovy,  double aspectRatio,
  6.                              double zNear, double zFar);
  7. // 生成透視投影矩陣,為靜態方法
  8. inline static Matrixd perspective(double fovy,  double aspectRatio, double zNear, double zFar);
複製程式碼 4)        正交投影相關方法
  1. // 獲得正交投影的相關引數
  2. bool getOrtho(double& left,   double& right,
  3.                       double& bottom, double& top,
  4.                       double& zNear,  double& zFar) const;
  5. // 將矩陣置為正交投影矩陣
  6. void makeOrtho(double left,   double right,
  7.                        double bottom, double top,
  8.                        double zNear,  double zFar);
  9. /** Set to a 2D orthographic projection.
  10. * See glOrtho2D for further details.
  11. */
  12. inline void makeOrtho2D(double left,   double right,
  13.                                 double bottom, double top)
  14. // 生成一個正交投影矩陣
  15. inline static Matrixd ortho(double left,   double right,
  16.                                     double bottom, double top,
  17.                                     double zNear,  double zFar);
複製程式碼 5)        視點視向相關方法
  1. // 獲取模型觀察矩陣的位置和方位
  2. void getLookAt(Vec3f& eye,Vec3f& center,Vec3f& up,
  3.                        value_type lookDistance=1.0f) const;
  4. // 生成一個模型觀察矩陣,用作設定相機
  5. // #Q: 模型觀察矩陣如何用在相機上?相機有什麼方法來接受模型試圖矩陣?
  6. #A: osg::Camera類提供了設定觀察矩陣的方法,setViewMatrix
  7. inline static Matrixd lookAt(const Vec3d& eye,
  8.                                      const Vec3d& center,
  9.                                      const Vec3d& up);
  10. // 將矩陣置為模型觀察矩陣
  11. void makeLookAt(const Vec3d& eye,const Vec3d& center,const Vec3d& up);
複製程式碼 6)        除轉換相關及以上相關外的其他方法
  1. // 生成一個單位矩陣
  2. inline static Matrixd identity( void );
  3. // 求逆矩陣
  4. inline static Matrixd inverse( const Matrixd& matrix);
  5. // 將矩陣置為引數矩陣的逆矩陣
  6. inline bool invert( const Matrixd& rhs);
  7. // 判斷是否是單位矩陣
  8. bool isIdentity() const;
  9. // 將矩陣置為單位矩陣
  10. void makeIdentity();
  11. // 矩陣乘法
  12. void mult( const Matrixd&, const Matrixd& );
  13. void preMult( const Matrixd& );
  14. void postMult( const Matrixd& );
  15. // operator function
  16. ……
複製程式碼 7)        #Q: 有多少東西是可以用矩陣來表示的?還有什麼東西是不能用矩陣來表示的?
#A: 正交投影、透視投影、模型觀察均可用矩陣來表示;
8)        #Q: 矩陣都用在了什麼地方?
看osg::Camera類
11.        看osg::Camera類
1)        跟矩陣相關的方法
  1. // 將本地矩陣轉換為世界矩陣,此方法可過載
  2. virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const;
  3. // 將世界矩陣轉換為本地矩陣,此方法可過載
  4. virtual bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const;
  5. // 取得投影矩陣,可對其進行修改
  6. osg::Matrixd& getProjectionMatrix();
  7. // 取得投影矩陣
  8. const osg::Matrixd& getProjectionMatrix() const;
  9. // 取得投影矩陣的正交投影引數
  10. bool getProjectionMatrixAsOrtho(double& left, double& right, double& bottom, double& top, double& zNear, double& zFar) const;
  11. // 取得投影矩陣的平面截體引數
  12. bool getProjectionMatrixAsFrustum(double& left, double& right, double& bottom, double& top, double& zNear, double& zFar) const;
  13. // 取得投影矩陣的透視投影引數
  14. bool getProjectionMatrixAsPerspective(double& fovy,double& aspectRatio, double& zNear, double& zFar) const;
  15. // 設定投影矩陣
  16. inline void setProjectionMatrix(const osg::Matrixd& matrix);
  17. // 以平面截體引數設定投影矩陣
  18. void setProjectionMatrixAsFrustum(double left, double right, double bottom, double top, double zNear, double zFar);
  19. // 以透視投影引數設定投影矩陣
  20. void setProjectionMatrixAsPerspective(double fovy,double aspectRatio, double zNear, double zFar);
  21. // 取得模型觀察矩陣,可對模型觀察矩陣進行修改
  22. osg::Matrixd& getViewMatrix();
  23. // 取得模型觀察矩陣
  24. const osg::Matrixd& getViewMatrix() const;
  25. // 獲取模型觀察矩陣的逆矩陣
  26. Matrixd getInverseViewMatrix() const;
  27. // 以eye,center,up方式設定模型觀察矩陣
  28. void setViewMatrixAsLookAt(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up);
  29. // 以eye,center,up方式取得模型觀察引數
  30. void getViewMatrixAsLookAt(osg::Vec3d& eye,osg::Vec3d& center,osg::Vec3d& up,double lookDistance=1.0) const;
  31. // 設定模型觀察矩陣
  32. inline void setViewMatrix(const osg::Matrixd& matrix);
複製程式碼 由上可知相機中可設定投影矩陣引數和模型觀察矩陣引數。
#Q: 那在相機中這兩個引數的作用是什麼呢?
#A: 在osg::Camera類中這兩個引數的定義如下:
  1. osg::Matrixd _projectionMatrix;
  2. osg::Matrixd _viewMatrix;
複製程式碼 在場景視景器中有一個預設的主屬相機,osgViewer::Viewer中。
相機預設帶有投影矩陣和模型觀察矩陣這兩個引數。
#Q: 那麼由誰來操作這個相機呢?
看一下相機操作器類osgGA::CameraManipulator
12.        看osgGA::CameraManipulator類
1)        跟操作相機相關的方法有:
  1. /** update the camera for the current frame, typically called by the viewer classes. 
  2. Default implementation simply set the camera view matrix. */
  3. virtual void updateCamera(osg::Camera& camera) { camera.setViewMatrix(getInverseMatrix()); }
複製程式碼 此類唯一直接操作相機的方法就是updateCamera,設定模型觀察矩陣。
可見相機操作器類是通過模型觀察矩陣來操作相機的。
接下來看一下此類中有哪些方法跟模型觀察矩陣有關。。。
2)        跟模型觀察矩陣有關的方法並沒有直接見到,從#1)中看到方法updateCamera中有呼叫getInverseMatrix方法,但是在osgGA::CameraManipulator中getInverseMatrix和getMatrix方法均為純虛擬方法:
  1. /** get the position of the manipulator as 4x4 Matrix.*/
  2. virtual osg::Matrixd getMatrix() const = 0;
  3. /** get the position of the manipulator as a inverse matrix of the manipulator, typically used as a model view matrix.*/
  4. virtual osg::Matrixd getInverseMatrix() const = 0;
複製程式碼 如此上兩方法的註釋可知,均為獲取操作器的位置,並以4X4矩陣來表示。而方法getInverseMatrix一般用作模型觀察矩陣。
#Q: 為什麼純虛擬方法可以被呼叫?如updateCamera方法所示。
猜測:在osgGA::CameraManipulator中跟模型觀察矩陣相關的引數有:
  1. osg::Vec3d        _homeEye;
  2. osg::Vec3d        _homeCenter;
  3. osg::Vec3d        _homeUp;
複製程式碼 先看著三個引數在哪些方法中被用到。
三個引數預設賦值為:
  1. _homeEye.set(0.0,-1.0,0.0);
  2. _homeCenter.set(0.0,0.0,0.0);
  3. _homeUp.set(0.0,0.0,1.0);
複製程式碼 這三個引數都跟home這個關鍵字有關,那麼跟home相關的其他都有:
  1. /** Compute the home position.
  2. 這個計算會考慮相機的視區的大小和模型的尺寸,把相機挪到足夠遠的位置來使得模型在整個螢幕的區域;如果引數camer為空,則相機到場景區的距離就無法計算,此時將基於模型的尺寸採用一個預設的值
  3. #Q: 但是計算好的值並沒有去改變相機的一些屬性,而是改變的_homeEye, _homeCenter, _homeUp,那麼它是如何做到使相機的位置移動到足夠遠呢?
  4. #A: 具體的如何去影響估計還是要靠setByMatrix,setByInverseMatrix和getMatrix,getByInverseMatrix方法,因為最終還是要歸到updateCamera方法上對camera的設定。
  5. */
  6. virtual void computeHomePosition(const osg::Camera *camera = NULL, bool useBoundingBox = false);
  7. /** Get the manually set home position. */
  8. virtual void getHomePosition(osg::Vec3d& eye, osg::Vec3d& center, osg::Vec3d& up) const
  9. {
  10. eye = _homeEye;
  11. center = _homeCenter;
  12. up = _homeUp;
  13. }
  14. /**
  15. Move the camera to the default position.
  16. May be ignored by manipulators if home functionality is not appropriate.
  17. */
  18. virtual void home(const GUIEventAdapter& ,GUIActionAdapter&) {}
  19. /**
  20. Move the camera to the default position.
  21. This version does not require GUIEventAdapter and GUIActionAdapter so may be
  22. called from somewhere other than a handle() method in GUIEventHandler.  Application
  23. must be aware of implications.
  24. */
  25. virtual void home(double /*currentTime*/) {}
  26. /** Manually set the home position, and set the automatic compute of home position. */
  27. virtual void setHomePosition(const osg::Vec3d& eye, const osg::Vec3d& center, const osg::Vec3d& up, bool autoComputeHomePosition=false)
  28. {
  29. setAutoComputeHomePosition(autoComputeHomePosition);
  30. _homeEye = eye;
  31. _homeCenter = center;
  32. }
複製程式碼 #Q: _homeCenter, _homeEye, _homeUp具體起到一個什麼作用?
#A: 這個也是用來輔助getInverseMatrix方法用的,具體怎麼用,還是要靠自己來定義。
#TODO(continue): 可自定義一個漫遊器來測試一下。
路徑漫遊下的相機控制:
http://www.52vr.com/bbs/forum.php?mod=viewthread&tid=23815
osg操縱器解析:
>重寫getMartix(),和getInverseMatrix()方法
http://lzchenheng.blog.163.com/b ... 353620106710534514/
>要編寫一個好的操縱器,必須首先過載setNode()和home()方法,根據根節點的包圍球,確定視點的初始位置,然後,根據視點的初始位置和使用者的操作(移動、旋轉等操作),過載getInverseMatrix()和getMatrix()方法,構建觀察矩陣或物體的位置姿態矩陣,這兩個矩陣互為逆矩陣。

相關推薦

3D數學--矩陣知識

本帖最後由 hunter_wwq 於 2013-7-24 14:04 編輯 開此貼是貼出自己在學如題所示知識點時所做的筆記,旨在跟我一樣菜的小朋友們共同學習探討一下這方面的知識,當然,絕對絕對歡迎大牛們來指點指教一下!!! 這是筆記附件:  下面也貼出筆記的內容,圖片和格式之類的我就不意義複製貼上過來了,太

[3D數學]矩陣 2017.8.16

旋轉矩陣 我們 進行 位移 組合 向量 bsp 一個 物體 <1>有時候我們想對整個物體做一定量旋轉,其實可以直接對物體坐標系進行相反量的旋轉 比如:現在想對一個物體順時針旋轉20度,再擴大200%,,既可以對這個物體的坐標系先縮小200%,再逆時

3D數學 矩陣和線性變換之切變

矩陣和線性變換之切變 1. 什麼是切變? 我們來看一幅圖片。下面的圖片,隨著y增大,x的偏移會越來越大。這種型別的變換就叫切換。我們可以得到下圖的公式x’ = x + sy。該公式轉換成矩陣就得到了切變矩陣。 2. 切變效果的矩陣是

3D數學 ---- 矩陣和線性變換(1)

包含平移的線性變換稱作仿射變換,3D中的仿射變換不能用 3 x 3 矩陣表達,必須使用4 x 4矩陣。 一般來說,變換物體相當於以相反的量變換描述這個物體的座標系。當有多個變換時,則需要以相反的順序變換相反的量。例如,將物體順時針旋轉20度,擴大200%,等價於將座標系縮小2

3D數學 矩陣乘法程式設計

矩陣乘法程式設計 設計一個3x3矩陣類,實現如下功能: 3x3矩陣 矩陣與矩陣的乘法 向量與矩陣的乘法 具體的數學知識就不詳述了,直接貼程式碼。這裡利用到上一篇3D數學向量運算的程式碼。 /

3D數學 ---- 矩陣和線性變換

一般來說,方陣能描述任意線性變換。線性變換保留了直線和平行線,但原點沒有移動。線性變換保留直線的同時,其他的幾何性質如長度、角度、面積和體 積可能被變換改變了。從非技術意義上說,線性變換可能“拉伸”座標系,但不會“彎曲”或“卷折”座標系。 矩陣是怎樣變換向量的 向量在幾何上能被解釋成一系列與軸平行的位

3D數學--矩陣彙總

在unity中矩陣的定義和使用 在Unity中我們都是使用4*4的矩陣 ,通過 Matrix4x4.SetRow 和Matrix4x4.SetCoiumn來設定4*4矩陣的某行和某列,通過 Matrix4x4.GetRow 和Matrix4x4.GetCoiu

Unity3d修煉之路:遊戲開發中,3d數學知識的練習【1】(不斷更新.......)

turn tor rdo pre 長度 scrip 縮放 unity3d float #pragma strict public var m_pA : Vector3 = new Vector3(2.0f, 4.0f, 0.0f); public var m_pB :

HDU多校賽第9場 HDU 4965Fast Matrix Calculation【矩陣運算+數學知識

stdin amp line you stream [] nbsp content ans 難度上。,,確實。。。不算難 問題是有個矩陣運算的優化 題目是說給個N*K的矩陣A給個K*N的矩陣B(1<=N<=1000 && 1=<K<

矩陣數學基礎知識

一 行列式 方陣 矩陣的基本概念 略 二 矩陣的轉置、逆、秩 矩陣的轉置就是將矩陣中的元素進行行列對換 矩陣的逆 設A是數域上的一個n階矩陣,若在相同數域上存在另一個n階矩陣B,使得: AB=BA=E ,則我們稱B是A的逆矩陣,而A則被稱為可逆矩陣。注:E為單位

3d數學基礎-映象矩陣和切變矩陣-用C++程式碼實現

#include <iostream.h> #include <math.h> #include <assert.h> const float kPi = 3.1415926f; const float k2Pi = kPi*2.0f;

3D數學基礎:矩陣的幾何解釋

一般來說,方陣能夠描述任意的線性變換。線性變換的定義在文章中已經提到。線性變換具體來說包括:旋轉、縮放、投影、映象、仿射。本文以旋轉為例講述矩陣的幾何意義。 一、基礎解釋 向量是基向量的線性組合,矩陣是基向量的集合。 世界座標系中的某一個向量使

3d數學基礎-旋轉矩陣-C++程式碼實現

#include <iostream.h> #include <math.h> #include <assert.h> const float kPi = 3.1415926f; const float k2Pi = kPi*2.0f;

3D數學矩陣的各種求逆

經過三天的準備終於把矩陣的各種求逆方法以及程式碼完成了。心裡有點小激動,come on,來吧,點燃你的心中的那團火,跟著遊戲音樂的律動一起跟我走入神祕的3D世界。 下面介紹三種方法: 1.用伴隨矩陣求逆 2.用高斯-約當消元法求逆 3.用LU分解求逆(聽別人說效率最高)

數學基礎知識復習

否則 sign 依次 log 定義 p s href 結合 itl 指數運算 XAXB = XA+B XA/XB = XA-B (XA)B = XAB 對數運算     定義: XA = B當且僅當logxB = A     定理: logAB = logCB/lo

3D數學基礎(四)四元數和歐拉角

transform 推薦 中間 應該 它的 轉變 編輯器 最簡 組件 一、四元數   四元數本質上是個高階復數,可視為復數的擴展,表達式為y=a+bi+cj+dk。在說矩陣旋轉的時候提到了它,當然四元數在Unity裏面主要作用也在於此。在Unity編輯器中的Transfor

例說數學基礎知識和綜合應用的關系

wid 是什麽 數學 總結 image img 技能 purple sum fieldset { border:0; border: 1px dashed #ddd; margin-top:20px; margin-bottom:20

3D數學基礎:圖形與遊戲開發_讀書筆記04

第六章3D介面類 這本書的第六章主要寫了一個工具類,用作之前所描述的概念中向量的計算還有一些運算子的過載,是用C++寫的。 因經驗等原因.我對程式碼設計方面還不是很瞭解,也沒有系統學習過C++,,總之先貼出本書章節中的C++程式碼。 #include<math.h>

3D數學基礎:圖形與遊戲開發_讀書筆記02

第四章概念(這一章也仍然是概念居多,應該要下一章才開始是計算的玩意) 標量 標量是數字的技術稱謂,使用這個詞是想突出數值 向量 向量(或稱向量)是明確帶有大小和方向的數學物件,在程式裡通常表現為陣列。 水平書寫的被稱為行向量,垂直書寫的被稱為列向量 行向量 [1,2,3] 列

3D數學基礎:圖形與遊戲開發_讀書筆記01

前三章內容摘要 通常技術書籍第一章都是為了介紹技術背景,數學書為了循序漸進也是很基礎的東西。就把重要的知識點抓出來 1)研究自然數和整數的領域稱作離散數學,研究實數領域叫做連續數學。 2)3D座標是由2D笛卡爾座標系衍生出來的,xz表示地面,y表示高度,而且上存在著3D兩種座標系(圖