關於3DsMax與Unity座標軸的若干問題詳解

關於3DsMax與Unity座標軸的若干問題詳解

  網上有很多敘述關於3DsMax製作的模型導入到Unity3D時如何進行座標軸處理的方法,大部分只告訴你該如何做,至於爲什麼也沒寫。有的解釋了,但是解釋的完全是錯誤的。由於我之前解析過FBX文件,所以對其的格式有所瞭解,但是之前一直使用OpenGL寫程序,U3D和3DsMax之間的糾葛我也沒怎麼了解,今天學習U3D時候碰到了所以針對座標軸的一些問題和FBX文件的一些問題寫了一篇文章,希望把東西分享出去同時記錄下來怕自己以後忘了。

一、 FBX文件格式

  FBX格式是Autodesk公司推出的一種“跨平臺”的模型文件格式也是U3D支持最好的模型文件格式,其跨平臺指的是在3DsMax、Maya、Blender等等建模軟件中都可以導出和導入(有的可能需要裝插件)甚至你可以自己寫程序去解析FBX數據,把你需要的頂點、UV、法線等等信息全部取出來。
  解析其中的數據一般是通過官方給的FBX SDK進行解析,因爲FBX導出時有兩種選項,一是文本格式(很少很少用)另一種就是二進制格式,所以針對文本格式,你可以自己分析自己寫解析器,但是對於二進制格式,你還是還是乖乖的使用FBX SDK,而且FBX有一個特點,就是它所包含的信息非常非常非常的多,普通的模型格式文件比如obj,它所包含的就是模型數據,頂點位置、法線、UV和材質(材質單獨爲mat文件),而且本身obj就是文本格式,簡單明瞭。而FBX包含的除了上面的基本信息還有蒙皮信息、骨骼信息和動畫信息以及很多的旋轉信息、每幀時間、座標系、燈光、攝像機、場景結點等等很多信息,它豐富的足以“保存”下一個遊戲場景而不是單單一個模型。加之官方對其的文檔讓人很無語,即使使用SDK仍然要花蠻多的時間弄懂這些信息代表的是什麼。

二、3DsMax和U3D使用的座標系及其轉換

  首先3DsMax使用的是右手座標系,Unity使用的是左手座標系
  左右手座標系的轉換是不能單靠一個旋轉就能解決的,必須翻轉某一個軸再進行渲染操作才能使得右手座標系到左手座標系
通常我們在3Ds建模完成的模型文件直接導入到Unity中,會看到Unity自動繞x方向旋轉了-90度(左手座標系)
U3D
如圖中的Rotation X
  很多人以爲Unity旋轉了一下就OK了,實際上Unity內部執行了座標軸翻轉操作。因爲3DsMax在使用右手座標系時Z軸向上,即使對z軸進行取負後仍需要旋轉才能跟U3D的座標軸對的上。
3DsMax
圖爲3Ds中的座標軸,可以看到使用右手座標系,並且z朝上

二、 導出時的Y軸向上和Z軸向上

  導出FBX文件時我們會看到座標軸可以選擇z還是y向上,但是不管你選哪個導入到Unity中貌似都沒什麼作用,實際上這個設置是有影響的,稍後會說道,現在要說清楚另一個事情。
  FBX文件會保存模型的頂點位置信息,這個頂點位置是相對於建模時使用的座標軸(默認就是右手,z向上)的模型空間頂點位置,不管你對其進行了平移、旋轉、縮放還是導出時怎麼設置,包括層次關係中選中“僅影響軸”對軸進行修改。這個頂點位置信息都不會變,它所依賴的座標系(右手,Z向上)都不會改變,始終是模型空間的位置信息。
回到上一個問題,導出時選擇Y還是Z,它這裏的哪個軸向上針對的都是右手座標系來說的,所以通過保存一個旋轉信息就能實現。在FBX文件中有一種屬性叫做PreRotation,它指明瞭模型的“初始旋轉”。
FBX
  這張圖是針對Y軸向上導出後保存的PreRotation信息,也就是說你的設置是有影響的,只不過Unity會忽略這個信息因爲本身頂點位置不會被改變(模型空間的頂點位置),管你是Y向上還是Z向上,加上了反而還會增加一次旋轉。
所以對於U3D開發者來說這個選項沒什麼用。

三、 調整軸操作

  還有一些文章會說道,如果你不想看到U3D裏面個-90度操作,你可以直接調整軸把物體的軸繞x軸旋轉90度就行了。確實,旋轉後U3D初始的繞x先旋轉-90的操作沒了,但是爲什麼?或者說調整軸這個操作改變了什麼?
實際上剛纔我也說道,無論你執行調整軸還是旋轉、平移、縮放操作,頂點位置是不會改變的,也就是說FBX只會保存旋轉信息,這個信息保存在哪裏了?
  FBX中還有一個屬性叫做Lcl Rotation,這個屬性保存的是物體的旋轉信息:
FBX
  注意看這三個屬性,你的一切平移、旋轉、縮放信息實際上是把模型從模型空間轉換到世界空間,這些轉換信息都會保存在Lcl xxxx屬性中,這裏的模型沒有這些操作所以都是0,對其進行旋轉操作,會看到:
FBX
  這和在3DsMax中的旋轉信息界面看到的一樣
  說了這麼多,和調整軸有什麼關係?實際上,調整軸操作本質上就是把物體旋轉了(或者平移、縮放,一般不會用到這兩個操作)。這裏先來說一下3DsMax調整軸的概念,首先它調整的不是真正的物體的局部座標系,你可以看到FBX文件中頂點位置仍然按照3DsMax默認的z向上的右手座標系。這裏的調整軸可以這樣理解,原本z向上的軸,你把它繞x軸旋轉90度使得y向上,z向前(物體一併旋轉)這時候的座標系就是y向上了,這裏注意繞x旋轉90度這個狀態(注意這個狀態)保留住就相當於局部座標系y向上了,但是爲了避免物體也被旋轉,就必須有一種變換先讓物體逆方向變換,這裏就是繞x逆方向90度旋轉。而且這種變換不能是模型變換,否則兩者抵消保留不住y向上的狀態。於是3DsMax引入了一種變換較GeometricTransform,針對旋轉就是GeometricRotation。也就是咱們在3DsMax看到的,你調整軸後,物體的旋轉信息就是你旋轉軸的旋轉信息。但是物體方位沒變。
這裏寫圖片描述
圖爲經過調整軸使得y向上後FBX文件中Geometric變換髮生了改變。如果沒調整軸這個變換平移、旋轉都是0。
  還有一個疑問,Lcl和Geometric發生了抵消,按理說Transform上仍然都會顯示-90爲什麼調整軸後會發生變化?
這裏寫圖片描述這裏寫圖片描述
左圖爲未調整軸導入到U3D時的情況,右圖爲調整軸後導入U3D的情況
這裏寫圖片描述
  左邊的茶壺的Transform就是上面左圖,右邊茶壺就是上面右圖
  可以看出位置都是正確的
這裏寫圖片描述
  對比上面2圖,可以看到局部軸實際上得到了調整。

  那麼爲什麼調整軸實際上效果抵消但是Transform上能顯示出差別呢?因爲對Geometric的變換是內部進行的,而Lcl的變換是會顯示到Transform上的。也就是說FBX中使用的座標系的信息自然會保存到FBX文件中,U3D發現座標軸不對。注意這裏的座標軸FBX中的局部座標軸仍然是z向上座標軸。U3D會執行翻轉z軸然後繞x軸旋轉-90度的操作。由於GeometricRotation不爲0先執行該變換,這是導入模型內部進行的。然後法線LclRotation爲90度,這個實際上就是對應到Rotation上的,然後執行-90度操作,二者抵消就是0度。而如果沒有調整軸,Lcl變換爲0,執行-90度操作就會看到Transform上的-90度

四、 總結

實際上咱們可以看出

  1. FBX中保存頂點位置依賴的是3DsMax中的座標軸,而旋轉、調整軸都不會改變這個座標軸所以頂點位置始終不變
  2. 導入一個FBX模型先內部進行Geometric變換,LclRotation就是模型座標系向世界座標系的變換,這會影響Transform上的Rotation
  3. 旋轉軸、調整軸的操作會保存在LclRotation上

      另外U3D實際上背後做了很多細節上的調整,你大可以忽略這些背後的原理,但是懂了這些更能看透一個引擎背後做了哪些東西,也能對座標軸的理解更深入。而且3DsMax中製作的模型直接導入到U3D就行,爲了避免一次旋轉而進行調整軸實際上內部還是會執行這次旋轉,而且還多一次旋轉。所以除非某些特殊情況大可不必進行調整軸的操作。
      對於FBX文件來說,可以看出這種文件格式包含了很多很多很多的信息,不僅僅是一個模型文件了。
    其實如果世界上都使用一種座標系,那這些較爲繁瑣的小細節都不會存在了,制定標準是一個很重要的事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章