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