3D數(shù)學基礎(chǔ)(一) | 坐標系
《3D數(shù)學基礎(chǔ):圖形與游戲開發(fā)》
前言
白玉無冰決定開一個新坑。再次重讀《3D數(shù)學基礎(chǔ):圖形與游戲開發(fā)》(第一版)。
結(jié)合Cocos Creator 引擎及其他相關(guān)書籍,整理并記錄一些筆記。

開始
坐標系有許多種,本文主要圍繞笛卡兒坐標系(Cartesian Coordinate System)展開。

計算機圖形學第一準則:近似原則。如果它看上去是對的,它就是對的。
左手坐標系與右手坐標系
3D坐標系中存在兩種坐標系:左手坐標系和右手坐標系。
伸出你的雙手,讓拇指(x)、食指(y)和中指(z)相互垂直,就構(gòu)成了相應(yīng)的坐標系。

?? OpenGL中的坐標系大體是右手坐標系,而Direct3D中大體是左手坐標系。
?? Cocos Creator 3.0 的世界坐標系采用的是笛卡爾右手坐標系,默認 x 向右,y 向上,z 向外,同時使用 -z 軸為正前方朝向。

其中旋轉(zhuǎn)也遵循對應(yīng)左右手法則,伸出雙手,做一個點贊?? 的手勢,拇指指向朝向,四指握著的方向為正。

?? Cocos Creator 3.0 中的旋轉(zhuǎn)(Rotation)遵守右手法則,從轉(zhuǎn)向軸往原點看,當屬性值為 正 時,節(jié)點 逆時針 旋轉(zhuǎn)。當屬性值為 負 時,節(jié)點 順時針 旋轉(zhuǎn)。

?? 注意:節(jié)點上的 rotation 屬性是一個四元數(shù),表示的是繞任意軸旋轉(zhuǎn)的角度。與 屬性檢查器 中的 Rotation 所對應(yīng)的屬性是歐拉角屬性 EulerAngles。這兩個屬性可以根據(jù)需求分別使用,在使用 API 時請一定要注意它們和編輯器面板屬性名的對應(yīng)區(qū)別。
左右手坐標系可以相互轉(zhuǎn)換,只需翻轉(zhuǎn)一個軸的符號。

世界坐標系
世界坐標系(World Coordinate)是一個特殊的坐標系,它建立了我們所關(guān)心的最大的空間。
世界坐標系建立了描述其他坐標系所需要的參考框架。也就是說,能夠用世界坐標系描述其他坐標系的位置,而不能用更大的、外部的坐標系來描述世界坐標系。

世界坐標系也被廣泛稱作全局坐標系或者宇宙坐標系。
關(guān)于世界坐標系的典型問題都是關(guān)于初始位置和環(huán)境:
每個物體的位置和方向 攝像機的位置和方向 世界中每一個點的地形是什么 各個物體從哪里來,到哪里去(NPC運動策略)
?? 世界坐標系也叫做絕對坐標系,在 Cocos Creator 3.0 游戲開發(fā)中表示場景空間內(nèi)的統(tǒng)一坐標體系,「世界」用來表示我們的游戲場景。

物體坐標系
物體坐標系(Local Coordinate)是和特定物體相關(guān)的坐標系。每個物體都有它們獨立的坐標系,當物體移動或改變方向時,和物體相關(guān)的坐標系也會改變。
某些情況下,物體坐標系也稱為模型坐標系。因為模型頂點的坐標是在模型坐標中描述的。
?? 物體坐標系 | 本地坐標系 | 模型坐標系 | 局部坐標系 ?可以看作一個東西多種叫法。
在物體坐標系中可能遇到的問題:
周圍有相互作用的物體嗎?(我要攻擊它嗎) 哪個方向?在我的前面后面?左邊?右邊?(我應(yīng)該向它射擊??,,還是轉(zhuǎn)身就跑???)

?? 模型定義的空間叫作局部空間(local space)或模型空間(model space)。OpenGL文檔使用的術(shù)語是物體空間(object space)。
?? Creator 3.0 的 節(jié)點(Node) 之間可以有父子關(guān)系的層級結(jié)構(gòu),我們通過修改節(jié)點的 Position 屬性設(shè)定的節(jié)點位置是該節(jié)點相對于父節(jié)點的 本地坐標系,而非世界坐標系。

?? 3D美工們在構(gòu)筑3D對象時也在做著類似的事情。他們并不會在全局場景坐標系(即世界空間,也譯為世界坐標系,world space)中構(gòu)建物體的幾何形狀,而是相對于局部坐標系(局部空間,也譯為局部坐標系,local space)來創(chuàng)建物體。
攝像機坐標系
攝像機坐標系可被看作是一種特殊的物體坐標系,該物體坐標系就定義在攝像機的屏幕可見區(qū)域。

關(guān)于攝像機坐標系的一些典型問題:
3D空間中的某個點是在攝像機的前方嗎? 3D空間中的某個點是在屏幕上,還是超出了攝像機平截面錐體的邊界?(裁剪坐標系) 某個物體是否在屏幕上?是部分在,還是全部不在? 兩個物體,誰在前面?(可見性檢測)

?? 我們?yōu)閿z像機賦予一個局部坐標系(這被稱作觀察空間(view space),也譯作觀察坐標系、視圖空間、視覺空間(eye space)或攝像機空間(camera space))
?? ?相機的可視范圍是通過 6 個平面組成一個 視錐體(Frustum) 構(gòu)成,近裁剪面(Near Plane) 和 遠裁剪面(Far Plane) 用于控制近處和遠處的可視距離與范圍,同時它們也構(gòu)成了視口的大小。

坐標系轉(zhuǎn)換
坐標變換:知道某一點的坐標,怎樣在另一個坐標系中描述該點。該點并沒有真正移動,而是在不同的坐標系中描述它的位置。

通常,坐標系間的變化會用矩陣(先挖個坑,后面再詳細講)表示。

?? 將局部坐標系內(nèi)的坐標轉(zhuǎn)換到全局場景坐標系中的過程叫作世界變換(world transform),所使用的變換矩陣名為世界矩陣(world matrix)
那么從全局坐標轉(zhuǎn)到局部坐標,就用世界矩陣的逆!

?? 由世界空間至觀察空間的坐標變換稱為取景變換(view transform,也譯作觀察變換、視圖變換等),此變換所用的矩陣則稱為觀察矩陣(view matrix,亦譯作視圖矩陣)。
攝像機也是屬于局部坐標的一種,也就是說,觀察矩陣 等同于 相機的世界矩陣的逆!

?? 舉個例子,場景中的有兩個節(jié)點,他們各自有一個子節(jié)點,求其中一個子節(jié)點在另一個子節(jié)點的局部坐標系中的坐標。

分三步走,解決上述例子:
求出B0的世界坐標 求出A0的世界矩陣的逆 將上面兩步的結(jié)果相乘
aW1wb3J0IHsgX2RlY29yYXRvciwgQ29tcG9uZW50LCBOb2RlLCBWZWMzLCB2MywgbWF0NCwgTWF0NCB9IGZyb20gJ2NjJzsKaW1wb3J0IHsgRURJVE9SIH0gZnJvbSAnY2MvZW52JzsKY29uc3QgeyBjY2NsYXNzLCBwcm9wZXJ0eSwgZXhlY3V0ZUluRWRpdE1vZGUgfSA9IF9kZWNvcmF0b3I7Cgpjb25zdCB0ZW1wX21hdDQgPSBtYXQ0KCk7CkBjY2NsYXNzKCdOb2RlRXh0cmFJbmZvJykKQGV4ZWN1dGVJbkVkaXRNb2RlCmV4cG9ydCBjbGFzcyBOb2RlRXh0cmFJbmZvIGV4dGVuZHMgQ29tcG9uZW50IHsKCiAgICBAcHJvcGVydHkKICAgIHByaXZhdGUgX3JlZnJlc2ggPSBmYWxzZTsKICAgIEBwcm9wZXJ0eSh7ZGlzcGxheU5hbWU6ICLliLfmlrAifSkKICAgIGdldCByZWZyZXNoKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yZWZyZXNoOwogICAgfQogICAgc2V0IHJlZnJlc2godmFsdWUpIHsKICAgICAgICB0aGlzLm9uVHJhbnNmb3JtQ2hhbmdlKCkKICAgIH0KCiAgICBAcHJvcGVydHkoeyByZWFkb25seTogdHJ1ZSwgZWRpdG9yT25seTogdHJ1ZSB9KQogICAgQXV0aG9yID0gIueZveeOieaXoOWGsCI7CgogICAgQHByb3BlcnR5KHsgcmVhZG9ubHk6IHRydWUsIGVkaXRvck9ubHk6IHRydWUgfSkKICAgIHdvcmxkUG9zaXRpb246IFZlYzMgPSB2MygpOwoKICAgIEBwcm9wZXJ0eSh7IGVkaXRvck9ubHk6IHRydWUsIGRpc3BsYXlOYW1lOiAi5Zyo6K+l6IqC54K55LiL55qEIiwgdHlwZTogTm9kZSB9KQogICAgb3RoZXJOb2RlOiBOb2RlID0gbnVsbCE7CgogICAgQHByb3BlcnR5KHsgcmVhZG9ubHk6IHRydWUsIGVkaXRvck9ubHk6IHRydWUsIGRpc3BsYXlOYW1lOiAi5Z2Q5qCHIiB9KQogICAgb3RoZXJOb2RlUG9zaXRpb246IFZlYzMgPSB2MygpOwoKICAgIG9uRW5hYmxlKCkgewogICAgICAgIGlmICghRURJVE9SKSByZXR1cm4KICAgICAgICB0aGlzLm9uVHJhbnNmb3JtQ2hhbmdlKCk7CiAgICAgICAgdGhpcy5ub2RlLm9uKE5vZGUuRXZlbnRUeXBlLlRSQU5TRk9STV9DSEFOR0VELCB0aGlzLm9uVHJhbnNmb3JtQ2hhbmdlLCB0aGlzKTsKICAgIH0KCiAgICBvbkRpc2FibGUoKSB7CiAgICAgICAgaWYgKCFFRElUT1IpIHJldHVybgogICAgICAgIHRoaXMubm9kZS5vZmYoTm9kZS5FdmVudFR5cGUuVFJBTlNGT1JNX0NIQU5HRUQsIHRoaXMub25UcmFuc2Zvcm1DaGFuZ2UsIHRoaXMpOwogICAgfQoKICAgIHByaXZhdGUgb25UcmFuc2Zvcm1DaGFuZ2UoKSB7CiAgICAgICAgdGhpcy53b3JsZFBvc2l0aW9uID0gdGhpcy5ub2RlLndvcmxkUG9zaXRpb247CiAgICAgICAgaWYgKHRoaXMub3RoZXJOb2RlKSB7CiAgICAgICAgICAgIGNvbnN0IG90aGVyTm9kZVdvcmxkTWF0cml4SW52ZXJ0ID0gTWF0NC5pbnZlcnQodGVtcF9tYXQ0LCB0aGlzLm90aGVyTm9kZS53b3JsZE1hdHJpeCk7CiAgICAgICAgICAgIFZlYzMudHJhbnNmb3JtTWF0NCh0aGlzLm90aGVyTm9kZVBvc2l0aW9uLCB0aGlzLndvcmxkUG9zaXRpb24sIG90aGVyTm9kZVdvcmxkTWF0cml4SW52ZXJ0KTsKICAgICAgICB9CiAgICB9Cn0=
復平面
剛好講到坐標系,這邊扯點其他相關(guān)的東西。
在復平面中,有一個實軸和一個虛軸。復數(shù)的乘積的幾何意義剛好是旋轉(zhuǎn)與縮放。

結(jié)束
白玉無冰預計下一期寫寫關(guān)于向量的筆記??。
參考資料
《DirectX 12 3D 游戲開發(fā)實戰(zhàn)》 《數(shù)學女孩》
碰撞組件多邊形頂點數(shù)組是怎么自動生成的
關(guān)于泰勒公式展開
寫一個位圖字體制作工具
替代 toDataURL 的方案
Fake3D && Shader
MatCap && Shader
如何抄shader
3D折紙
更多精彩歡迎關(guān)注微信公眾號
