關於 web service, unity, blogger 等軟體工程筆記

如何修正 3ds Max 模型輸出到 Unity 後顯示很奇怪的問題

Edit icon 沒有留言
坦克繪製,左邊為非預期的結果,右邊為想要的繪製結果

經常有人問,為什麼從 3ds Max 輸出的模型 (model),匯入到 Unity 中後,繪製 (rendering) 結果會變成圖中左邊的坦克,而非右邊的樣子。

並不是因為 Unity 有臭蟲 (bugs),而是美術設計模型弄錯了,沒有發現直接輸出。

為什麼會這樣

在開始回答這問題之前,得先介紹 backface culling (背面剔除),這是一種增加繪製效率的方法

當一個面 (face) 進行光照計算顏色是很花時間的,若已知該面沒有朝向攝影機,如下圖中的紅色面,那麼根本沒有繪製的必要,可以剔除 (culling) 不畫。例如下圖的紅色面。

3D 空間中的正方體以及攝影機的俯視圖示意圖

3D 空間中的正方體以及攝影機 (camera) 的俯視圖,其中綠色表示正朝向攝影機的面,紅色表示背朝向攝影機的面,N 表示該面的法向量 (face normal),eye 表示攝影機的 forward vector。

如何判斷面是背朝向或是正朝向攝影機,使用攝影機 forward vector \overrightarrow{eye} 與 face normal \overrightarrow{N} 的夾角便可得知,數學可以參考 [0] Vectors in Action: Backface Culling

那首圖繪製錯誤的原因是什麼,仔細觀察那張坦克圖,很明顯的面向攝影機的面沒有畫,而背向攝影機的面卻有畫。face normal 搞錯方向了!

解決方法

第一種解法是修改 Shader,將 Culling mode 關閉,Cull Off,但這種做法會造成繪製效率下降,而且得自己修改 Shader。

第二種做法是,在 3ds Mx 做完 Reset XForm 後,準備輸出模型前 (export FBX),Flip face normal 即可。如何操作請搜尋 3ds max support,或是參考 Reference 的連結。

身為一個工程師,沒有製作 model 的經驗是很正常的,這邊就沒法丟操作截圖。

可能會冒出一個疑問,為什麼美術沒有在 3ds Max 中就發現反面的問題,八成是美術預設的瀏覽模式把 Backface culling 關閉……。

Reference

沒有留言: