3d数学基础学习总结
生活随笔
收集整理的這篇文章主要介紹了
3d数学基础学习总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
3d數(shù)學(xué)基礎(chǔ)目錄
第1章 簡介1.1 什么是3D數(shù)學(xué)
1.2 為什么選擇本書
1.3 閱讀本書需要的基礎(chǔ)知識
1.4 概覽
第2章 笛卡爾坐標(biāo)系統(tǒng)
2.1 1D數(shù)學(xué)
2.2 2D笛卡爾數(shù)學(xué)
2.3 從2D到3D
2.4 練習(xí)
第3章 多坐標(biāo)系
3.1 為什么要使用多坐標(biāo)系
3.2 一些有用的坐標(biāo)系
3.3 嵌套式坐標(biāo)系
3.4 描述坐標(biāo)系
3.5 坐標(biāo)系轉(zhuǎn)換
3.6 練習(xí)
第4章 向量
4.1 向量——數(shù)學(xué)定義
4.2 向量——幾何定義
4.3 向量與點
4.4 練習(xí)
第5章 向量運算
5.1 線性代數(shù)與幾何
5.2 符號約定
5.3 零向量
5.4 負(fù)向量
5.5 向量大小(長度或模)
5.6 標(biāo)量與向量的乘法
5.7 標(biāo)準(zhǔn)化向量
5.8 向量的加法和減法
5.9 距離公式
5.10 向量點乘
5.11 向量叉乘
5.12 線性代數(shù)公式
5.13 練習(xí)
第6章 3D向量類
……
第7章 矩陣
第8章 矩陣和線性變換
第9章 矩陣的更多知識
第10章 3D中的方位與角位移
第11章 C++實現(xiàn)
第12章 幾何圖元
第13章 幾何檢測
第14章 三角網(wǎng)絡(luò)
第15章 圖形數(shù)學(xué)
第16章 可見性檢測
========
3D數(shù)學(xué)基礎(chǔ)_01
http://blog.csdn.net/eclaix/article/details/6366878在進(jìn)行3D編程的時候, 需要知道一些基礎(chǔ)的數(shù)學(xué)知識. 我做了一些整理, 希望對大家有用. 因為只是一
些重點的整理, 很多內(nèi)容不是連續(xù)的. 如果希望更進(jìn)一步的理解, 還是去看相關(guān)圖形學(xué)的書比較好.
?
1: ?3D游戲渲染的原理.
2D游戲的圖像很容易理解, 一副副圖片以各種方式排列在一起就OK了.
3D游戲的圖像稍微復(fù)雜一些:
首先需要使用數(shù)學(xué)方法構(gòu)建一個世界. 這個世界不是真實存在的, 而且也不是直接可見—因為它們就是
一對數(shù)字. 然后選取觀察點(Camera)和觀察窗口(視窗), 根據(jù)各種數(shù)學(xué)方法, 計算出從觀察點(camera)
應(yīng)該看到的圖像. 然后顯示出來.
渲染結(jié)果: 從相機這一點看到的圖像—當(dāng)然, 它們不是真實存在的, 而是計算得出.
?渲染結(jié)果
?
2: 屏幕坐標(biāo)系(2D)與3D坐標(biāo)系
首先是屏幕坐標(biāo)系. 計算機的顯示屏幕是2D的. 不管玩的是2D游戲, 還是3D游戲.
而且需要注意的是, 屏幕坐標(biāo)系中左上腳為原點(0, 0). 向右, 向下延伸. 在做GUI相關(guān)編程時需要注意
這一點.
??
之后是3D坐標(biāo)系. 首先3D坐標(biāo)系與2D坐標(biāo)系有一個重要的不同, 就是有兩個3D坐標(biāo)系: 左手坐標(biāo)系和右
手坐標(biāo)系.
(而2D坐標(biāo)系只有一個: 不管將2D坐標(biāo)系畫成什么樣子, 總可以根據(jù)旋轉(zhuǎn), 將它們重合. 也就是所有2D坐
標(biāo)系都是等價的. )
可以看到, 左手坐標(biāo)系不管怎么旋轉(zhuǎn), 都不可能與右手坐標(biāo)系重合. 但是左手坐標(biāo)系之間, 或者右手坐
標(biāo)系之間是等價的. 所以3D的世界中有兩種坐標(biāo)系. 它們之間沒有任何優(yōu)劣之分. DirectX使用左手坐標(biāo)
系, OpenGL和OGRE中使用右手坐標(biāo)系. 搞錯坐標(biāo)系的話, 會出現(xiàn)位置不對等奇怪現(xiàn)象, 需要注意.
??
3: 多坐標(biāo)系
游戲編程中, 最常見的有三種坐標(biāo)系: 世界坐標(biāo)系, 物體坐標(biāo)系, 相機坐標(biāo)系. (還有一個是慣性坐標(biāo)系
, 游戲中不常用, 就不提了.)
A: 世界坐標(biāo)系描述的是絕對位置, 也叫作全局坐標(biāo)系或者宇宙坐標(biāo)系.?
對應(yīng)Global Position.
?B: 物體坐標(biāo)系是以某個物體的中心為原點的坐標(biāo)系.
對應(yīng)Local Position
? ? 一般物體自轉(zhuǎn)的話, 一定要在物體坐標(biāo)系中作.
?C: 相機坐標(biāo)系. 相機坐標(biāo)系就是以相機為原點的坐標(biāo)系. 其實它是一個特殊的物體坐標(biāo)系. (相機也是
一個物體)
? ? 另外, 左手坐標(biāo)系中, +Z為觀察方向; 右手坐標(biāo)系中 –Z為觀察方向.
? ? 在手動計算位置(各種Debug)的時候, 非常重要.
為什么要引入這么多坐標(biāo)系? 其實就是為了處理簡單. 具體原因的話參考相關(guān)書籍, 使用中記住有這么
三種重要的坐標(biāo)系就OK了.
4: 向量, 矩陣與變換
向量&矩陣的定義和運算, 請參考線性代數(shù)教科書.
這里主要介紹3D引擎中經(jīng)常出現(xiàn)的4D矩陣.
它的寫法是:
其中的R代表旋轉(zhuǎn)部分, T代表平移部分. 旋轉(zhuǎn)的R部分比較復(fù)雜,請參考專業(yè)書籍; T的換比較簡單X,Y,Z
分別代表在X軸, Y軸, Z軸上的平移量.
如果在3D引擎中看到一個4*4矩陣, 那么很大的可能是以上形式的矩陣.
?
3D引擎中的變換主要包括平移, 旋轉(zhuǎn), 縮放, 投影, 鏡像變換等. 其中投影又包括正交投影和透視投影.
?
5: 方位(Orientation)與角位移
3D引擎中處理最多的, 應(yīng)該就是平移與旋轉(zhuǎn)了. 上邊的4D矩陣定義中也可以發(fā)現(xiàn), 就有2塊: 旋轉(zhuǎn)和平移
. 平移的話比較簡單, 沿著X, Y, Z移動的量構(gòu)成了這個物體在3D空間中的平移. 旋轉(zhuǎn)的話, 就非常復(fù)雜
了. ( 至少我這么想-_-)
首先, 需要明確一下概念: 方向(Direction)與方位(Orientation).
一開始可能比較難區(qū)分這兩個概念…..其實搞清除了也簡單, 方位(Orientation)是方向(Direction)加
自轉(zhuǎn).
?
兩架飛機. 它們都沿著同一個方向飛行. 假設(shè)是北(N).
它們的方向雖然相同, 但它們的方位不同. 第二架飛機相比第一架飛機, 自轉(zhuǎn)了90度.
?
方位的概念.
描述物體位置時, 必須指定一個原點, 位置是相對于原點的偏移量.
同樣, 描述方位時, 也必須指定一個已知方位(起始方位), 相對已知方位的旋轉(zhuǎn)的量就是這個物體的方
位. 這個旋轉(zhuǎn)的量叫做角位移.
(概念上雖然不同, 角位移的值與方位的值時一樣的. 類似與偏移量與位置的關(guān)系)
3D引擎中有三種方法表示方位: 矩陣, 歐拉角, 四元數(shù).
通常情況下, 用矩陣和四元數(shù)表示角位移(用于計算); 用歐拉角表示方位(用于人來查看).
(這部分十分繞, 反正我理解的時候累死了無數(shù)腦細(xì)胞…大家慢慢琢磨吧)
?
A: 歐拉角
? ?要想知道一個物體的方位, 那么只要知道它與X, Y, Z軸之間的夾角就可以了.
對人來說, 這是最直觀也是最簡潔的方式. 相對于各個軸的夾角被命名
為Roll-Pitch-Yaw. (也有一種Heading-Pitch-Bank的命名法, 不過與慣性坐標(biāo)系相關(guān),
于是忽略掉)
? ?Roll(Bank) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?與Z軸的夾角
Pitch ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?與X軸的夾角
Yaw(類似Heading) ? ? ? 與Y軸的夾角
歐拉角優(yōu)點是簡潔(只有三個數(shù)), 便于人理解; 但缺點是不方便計算.
于是有了以下兩種表示方法.
?
B: 矩陣
? ?矩陣數(shù)字最多, 3*3一共9個. 概念也比較簡單, 直接作乘法就可以了.
但缺點就是需要存儲的數(shù)字多.
?
C: 四元數(shù)
? ?個人以為這個是最難理解的概念之一… 但是它的優(yōu)點就是比較簡潔(四個數(shù)),
而且便于計算, 尤其是插值運算. 四元數(shù)的誕生還有一段有趣的小故事,
有興趣的同學(xué)可以趣看看.
?
? ?一個四元數(shù)包括一個標(biāo)量分量和一個3D向量分量. 一般記為[w, v] = [w, x, y, z].
? ?四元數(shù)通過以下方式應(yīng)用于3D引擎中.
? ?首先是概念基礎(chǔ): 一個旋轉(zhuǎn)序列(也就是很多個旋轉(zhuǎn))等價于一個單個旋轉(zhuǎn). -> 也就是
任何角位移都能表示為 繞單一軸的單一旋轉(zhuǎn). 這個軸叫做旋轉(zhuǎn)軸, 它可以是任意方向.
然后是四元數(shù)記法: 設(shè) n 為旋轉(zhuǎn)軸, a 為旋轉(zhuǎn)角, 那么四元數(shù)
Q = [ cos(a/2), sin(a/2)*n ] = [ cos(a/2), sin(a/2)*nx, sin(a/2)*ny, sin(a/2)*nz ]
注意, 角的值a與軸的方向x,y,z都沒有直接出現(xiàn). 都經(jīng)過了三角函數(shù)的換算.
(這樣作是為了方便插值運算, 不過…嗯, 隨便吧, 寫一遍都覺得累. 至少知道里邊的
值是經(jīng)過三角函數(shù)變換的. 如果直接拿出來當(dāng)角度值, 那就窘了.)
另外, 只用單位四元數(shù)(模為1)來表示方位.
?
這三種表現(xiàn)方式之間是可以互相轉(zhuǎn)換的. 給一個最簡單的: 四元數(shù)到歐拉角
Pitch角 ? ?= asin(-2(yz + wx))
Yaw角 ? ?= atan2(xz – wy, 1/2 – x^2 - y^2) ?cos(pitch角) != 0
? ? ? ? ? ? ? ?= atan2(xz – wy, 1/2 – y^2 - z^2) ?cos(pitch角) == 0
Roll角 ? ? = atan2(xy – wz, 1/2 – x^2 - z^2) ?cos(pitch角) != 0
? ? ? ? ? ? ? ?= 0 ?cos(pitch角) == 0
?
其他n長的轉(zhuǎn)換公式大家自己找圖形學(xué)書. 其實看看就行, 知道有這么回事兒就可以. 在圖形引擎中已經(jīng)
將這些東西都實現(xiàn)好了. 一般還是會用是最終目標(biāo).
========
3D數(shù)學(xué)基礎(chǔ)_02
6: 幾何圖元
幾何圖元就是指點, 線, 面, 體之類.
這個沒什么特別好說的. 主要需要注意兩個縮寫:
AABB和OBB. 它們都是指矩形邊框,
AABB指 axially aligned bounding box. ?沿著坐標(biāo)軸的矩形框
OBB 指 oriented bounding box. 任意方向的矩形框
(作幾何檢測的時候, 有時候按照AABB和OBB分成兩類. 知道是什么東西就可以, 別被縮寫騙了. 不知道
是什么的時候, 覺得玄乎玄乎還挺神秘的, 知道了以后, 原來就是四方塊…)
幾何檢測的幾種方式。其中的(a),(b),(c)比較常用。
7: 3D模型
3D模型主要包括三類: 多邊形網(wǎng)格模型, 曲面模型和離散模型. 其中, 在游戲中應(yīng)用最廣泛的是多邊形
網(wǎng)格. 而由于OpenGL和Direct3D都使用三角形為最基本的圖形單元, 所以我們只討論三角形與三角網(wǎng)格.
一組相連的三角形稱為三角網(wǎng)格.
3D數(shù)學(xué)中三角形有正面和反面, 并且擁有一條法線. 三角形的正面是其法線伸出的方向.
三角形的優(yōu)點:只有三個頂點且不可被拆分. 一個三角形一定處于同一個平面中. 其他多變形都可能處于
不同平面. 所有其他多邊形都可以使用三角形來表示.
?三角形頂點的順序十分重要. 而且左手坐標(biāo)系和右手坐標(biāo)系中, 它們的順序也不盡相同. 如果手動指定
了3個頂點, 但是沒有顯示對應(yīng)的三角形. 那么很有可能是它們的順序不對. 這時候你需要確認(rèn)一下系統(tǒng)
的坐標(biāo)系和頂點的位置和順序.
?
三角網(wǎng)格中因為存在大量重復(fù)使用的頂點, 所以一般常用索引三角網(wǎng)格方式來進(jìn)行描述.
在索引三角網(wǎng)格中, 需要維護(hù)兩個列表: 頂點(Vertex)表和三角形的索引(Index)表.
其中:
? A: 每個頂點必須包括一個3D位置. 可選包括紋理坐標(biāo), 表面法向量, 光照值等可選數(shù)據(jù).
? B: 三角形索引表包含構(gòu)成三角形的索引. 所以索引是三個一組出現(xiàn).
??
這是一個普通的立方體模型. 它有8個頂點和6個面. 每個面都是四方形, 一個四方形由2個三角形構(gòu)成.?
所以它有12個三角形.
如果采用純頂點方式, 那么它需要保存 12 * 3 = 36個頂點數(shù)據(jù).
如果采用索引三角網(wǎng)格方式, 那么它需要保存8個頂點, 36個索引. 之后的文章中我會介紹典型的頂點和
索引定義. 通常索引只是一個4字節(jié)整數(shù), 而頂點可能包含多個數(shù)據(jù)(一般超過20個字節(jié)). 那么, 在渲染
時, 動則需要向GPU傳遞幾萬個點信息的情況下, 使用索引是非常經(jīng)濟(jì)的選擇.
8: 一個典型的圖形管道
最后, 介紹一個典型的現(xiàn)代圖形管道(pipe line).
主要通過數(shù)據(jù)流來介紹管道的各個部分.
這只是一條理論上的管道, 之后會介紹DirectX9的缺省pipe line(一個具體的例子.)
當(dāng)然, 大家會發(fā)現(xiàn), 它們之間還是非常相似的.
? A: 建立場景. 在開始渲染之前, 首先需要設(shè)置整個場景. 比如相機的位置, 方向. 視錐(可視范圍),?
環(huán)境光照, 霧化參數(shù). 渲染的輸出—視圖窗口等.
視錐?
?
? B: 可見性檢測. 當(dāng)選定好相機, 指定了視錐參數(shù)以后, 就可以決定那些物體是可見的, 那些是不可見
的. 根據(jù)這些信息, 我們可以去掉那些不可見的物體. 因為計算并渲染看不見的東西是在浪費時間.
? C: 設(shè)置物體的渲染狀態(tài). 主要是物體的紋理屬性.
? D: 幾何體的生成與提交. 這一步是向3D API提交幾何體. 通常提交的數(shù)據(jù)是各種三角形或者三角網(wǎng)格
.
? E: 變換與光照. 幾何體數(shù)據(jù)傳遞完成之后, 就可以計算頂點光照. 通常有四種形式的光: 環(huán)境光, 直
線光, 點光, 錐形光. 物體上可以漫反射, 鏡面反射照射過來的光線. 物體也可以自發(fā)光. (通常自發(fā)光
的屬性在物體材質(zhì)中設(shè)置.)
點光
直線光
直線光
?
探照燈形光
錐形光
? ?
? F: 背面剔除與裁減(3D). 背對相機的面會被剔除(背面剔除). 因為它們不可見. 三角形在視錐外的部
分也會被剔除, 同樣因為它們不可見. 這是3D空間中的裁減. 不過這種裁減可能導(dǎo)致多邊形出現(xiàn).
? G: 投影到屏幕空間與裁減(2D) 之后, 3D世界中的幾何體會被投影到2D屏幕空間中. 之后, 屏幕顯示
范圍以外的部分會被裁減掉(2D裁減). 這種裁減相比之下簡單易行. 但是必須在投影運算之后進(jìn)行。
?
? H: 光柵化. 當(dāng)完成多邊形到屏幕的轉(zhuǎn)換之后, 就進(jìn)入光柵化階段. 光柵化指根據(jù)投影過來的幾何信息
, 那些象素需要被繪制. 很多圖形學(xué)的核心算法在這里體現(xiàn). 比如抗鋸齒等. 不過因為大多是硬件實現(xiàn),?
所以這里不具體討論. 只要知道它是一個很復(fù)雜且重要的過程即可.?
數(shù)學(xué)世界中的圖形 轉(zhuǎn)換到 屏幕上的像素點
?
? I: 象素著色. 最后, 在圖形管道的最后階段, 計算各個象素的顏色值. 這個過程叫做著色.材質(zhì)的顏
色, alpha混合, 深度buffer都在這里應(yīng)用. 而且在現(xiàn)代顯卡上, 這一步是可以編程的. DirectX中叫做
Pixel Shader, OpenGL中叫做Fragment Shader. 它們中可以包含一些復(fù)雜的算法. 而現(xiàn)在各種華麗的效
果基本都通過它們實現(xiàn). 比如HDR, 卡通渲染等等.
?
一個HDR和卡通渲染出來的茶壺. 可以雖然是同樣的模型, 但他們的表現(xiàn)方式卻可以千差萬別.而這都是
通過著色來實現(xiàn)的.
另外, 學(xué)習(xí)3D的人應(yīng)該已經(jīng)發(fā)現(xiàn), 茶壺是出現(xiàn)頻率非常高的一種物體, 基本快趕上立方體了… 不知道大
家有沒有想過原因?:)
========
總結(jié)
以上是生活随笔為你收集整理的3d数学基础学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解OpenLayers-2.13.1入
- 下一篇: DOS命令温习(图解)