深入理解3D引擎的坐標變換 -- 原創(chuàng)

3D引擎的基本功能是將三維空間中的物體洽糟,經(jīng)過一些變換和處理,映射到二維屏幕上详恼。要理解這一過程补君,3D圖形程序員,不管是3D引擎的maker還是user昧互,都必須徹底理解從3D空間映射到2D平面需要的變換過程挽铁,特別是背后蘊含的數(shù)學原理伟桅。網(wǎng)上有不少介紹的文章,有的蜻蜓點水叽掘,有的專注于某一方面楣铁,幾乎沒有人能夠或者愿意全面、徹底的更扁,以面向初學者的口吻來解釋其中的機理盖腕,這篇文章嘗試來做這件事,借此機會順便鞏固下自己的圖形學基礎(chǔ)浓镜。

經(jīng)典的OpenGL固定渲染管線變換流程溃列,如下圖所示,雖然目前的3D圖形API(OpenGL和Direct3D )都已經(jīng)采用了可編程的渲染管線竖哩,但變換的思路都是一樣的哭廉。

gl_tranformation.png

坐標變換的基本流程是: object物體坐標系 -> world世界坐標系 -> camera視覺坐標系 -> clip裁剪坐標系 -> normalized device 規(guī)范化設備坐標系 -> window 窗口坐標系。


初學者看到這相叁,別說理解遵绰,就是去強記也很費勁,但3D引擎并非街頭小食增淹,讓我們有點耐心椿访,一點點啃吧。

  1. object坐標系
    描述某一個物體的坐標系虑润, 和world坐標系 描述 整個世界相比成玫,它是一個局部坐標系, 只負責描述某一個物體拳喻。因為是建模時采用的坐標系哭当,也常稱之為模型坐標系。這里的物體冗澈,在3D引擎的語境里钦勘,主要是指meshcamera等 對象亚亲。mesh有兩種彻采,靜態(tài)網(wǎng)格骨架網(wǎng)格,一般由 3DS Max捌归,Maya等建模軟件制作并導入肛响。

關(guān)于object坐標系,網(wǎng)上不少教程惜索、文章寥寥幾句帶過特笋,對初學者來說,原理雖然簡單门扇,細節(jié)還是不少的雹有,我試著從中心點偿渡、方向、坐標單位三個方面一一闡述霸奕。

  • 中心點
    一般來說溜宽,object坐標系的中心點會選擇物體的中心點,也可以是物體底部的中心點质帅, 主要是為了方便使用适揉。舉例來說,球體的坐標系中心點一般選擇在球心煤惩,而路燈嫉嘀,建筑的坐標系中心點則會選擇位于底部中心。
  • 方向
    object坐標系方向選擇是任意的魄揉,但一般的習慣是剪侮,將XY平面作為水平面,Z軸表示垂直方向 或者 XZ平面作為水平面洛退,Y軸表示垂直方向瓣俯。此外,要特別注意左右手坐標系兵怯。OpenGL API 接受右手彩匕,Direct3D是左手。3D引擎媒区, 會選擇其中一個規(guī)則驼仪,而在底層作Z軸翻轉(zhuǎn)適配即可。
  • 單位
    object坐標系取米或厘米袜漩。但某些特殊的場景绪爸,需要考慮浮點數(shù)表示精度,IEEE754規(guī)則: float 有效數(shù)字6-7 位宙攻, double 15 -16 位毡泻。舉例來說,在最小精度厘米的情況下粘优,你打算給一個方圓幾十甚至上百公里城市建筑整體建模,用float肯定不合適呻顽,當然用double雹顺,也顯得浪費。3D引擎的精度的選擇廊遍,遵循夠用就好嬉愧,高精度意味著性能損失,不要輕易的采用double喉前,特別是在性能和耗電量極其敏感的移動端没酣。 實際開發(fā)中王财,給城市這種大規(guī)模靜態(tài)物體建模,會將它分成一塊塊的 tile裕便,每塊tile一平方公里面積, 這種情況下绒净,float 足夠了。
  1. 通過 模型變換object坐標空間變換到 world坐標空間
    模型變換有 縮放偿衰、旋轉(zhuǎn)挂疆、平移,接下來下翎,龐大的數(shù)學開始了缤言, 整理下思路,待續(xù)...
    最近太忙了视事,仔細想了下胆萧,要寫透的話,這篇文章字數(shù)會很長俐东。跌穗。。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犬性,一起剝皮案震驚了整個濱河市瞻离,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乒裆,老刑警劉巖套利,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹤耍,居然都是意外死亡肉迫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門稿黄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊衫,“玉大人,你說我怎么就攤上這事杆怕∽骞海” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵陵珍,是天一觀的道長寝杖。 經(jīng)常有香客問我,道長互纯,這世上最難降的妖魔是什么瑟幕? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上只盹,老公的妹妹穿的比我還像新娘辣往。我一直安慰自己,他們只是感情好殖卑,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布站削。 她就那樣靜靜地躺著,像睡著了一般懦鼠。 火紅的嫁衣襯著肌膚如雪钻哩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天肛冶,我揣著相機與錄音街氢,去河邊找鬼。 笑死睦袖,一個胖子當著我的面吹牛珊肃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馅笙,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼伦乔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了董习?” 一聲冷哼從身側(cè)響起烈和,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皿淋,沒想到半個月后招刹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窝趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年疯暑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哑舒。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡妇拯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洗鸵,到底是詐尸還是另有隱情越锈,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布膘滨,位于F島的核電站瞪浸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吏祸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贡翘。 院中可真熱鬧蹈矮,春花似錦、人聲如沸鸣驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踊东。三九已至北滥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闸翅,已是汗流浹背再芋。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坚冀,地道東北人济赎。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像记某,于是被迫代替她去往敵國和親司训。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容