3D引擎的基本功能是將三維空間中的物體洽糟,經(jīng)過一些變換和處理,映射到二維屏幕上详恼。
要理解這一過程补君,3D圖形程序員,不管是3D引擎的maker還是user昧互,都必須徹底理解從3D空間映射到2D平面需要的變換過程挽铁,特別是背后蘊含的數(shù)學原理伟桅。網(wǎng)上有不少介紹的文章,有的蜻蜓點水叽掘,有的專注于某一方面楣铁,幾乎沒有人能夠或者愿意全面、徹底的更扁,以面向初學者的口吻來解釋其中的機理盖腕,這篇文章嘗試來做這件事,借此機會順便鞏固下自己的圖形學基礎(chǔ)浓镜。
經(jīng)典的OpenGL固定渲染管線變換流程溃列,如下圖所示,雖然目前的3D圖形API(OpenGL和Direct3D )都已經(jīng)采用了可編程的渲染管線竖哩,但變換的思路都是一樣的哭廉。
坐標變換的基本流程是:
object
物體坐標系 ->world
世界坐標系 ->camera
視覺坐標系 ->clip
裁剪坐標系 ->normalized device
規(guī)范化設備坐標系 ->window
窗口坐標系。
初學者看到這相叁,別說理解遵绰,就是去強記也很費勁,但3D引擎并非街頭小食增淹,讓我們有點耐心椿访,一點點啃吧。
-
object
坐標系
描述某一個物體
的坐標系虑润, 和world
坐標系 描述 整個世界
相比成玫,它是一個局部
坐標系, 只負責描述某一個物體拳喻。因為是建模時采用的坐標系哭当,也常稱之為模型坐標系
。這里的物體
冗澈,在3D引擎
的語境里钦勘,主要是指mesh
、camera
等 對象亚亲。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
足夠了。
- 通過
模型變換
將object
坐標空間變換到world
坐標空間
模型變換有 縮放偿衰、旋轉(zhuǎn)挂疆、平移,接下來下翎,龐大的數(shù)學開始了缤言, 整理下思路,待續(xù)...
最近太忙了视事,仔細想了下胆萧,要寫透的話,這篇文章字數(shù)會很長俐东。跌穗。。