Unity執行時輸出場景物體及角色為fbx檔案

2021-10-10 00:01:44 字數 2677 閱讀 7122

在unity中匯入fbx是個跟簡單的事,只需要把fbx放到unity的專案資料夾下,它就能自動識別並讀取了,但是在unity執行的過程中輸出fbx卻相當麻煩。因為工作專案的需求,需要把場景中的物體在執行時匯出成fbx,所以對這個功能進行了研究,在unity商店也有一些匯出的外掛程式,但是基本都是只限於基本的幾何體匯出,要不就是不支援skinned mesh,要不就是不支援blendshape。因為這個專案的需求是需要把動作捕捉和面部捕捉的資料,寫入到模型中並匯出到fbx,所以也基本都不能滿足需求,那就只能自己從頭開始研究了。     

要寫fbx檔案,就需要對fbx檔案進行研究,簡單來說fbx檔案是類似於json結構的一種檔案,首先是該fbx檔案的基本資訊,包括fbx版本,作者,標題、單位資訊以及座標系統資訊。

fbxexpter.setfileexportversion("fbx201400");

fbxexpter.setprogresscallback(fbxprogresscallback);

fbxscene fbxscene = fbxscene.create(fbxmgr, "scene");

fbxdocumentinfo fbxdocinfo = fbxdocumentinfo.create(fbxmgr, "sceneinfo");

fbxdocinfo.mtitle = "exports static meshes with materials and textures";

fbxdocinfo.msubject = "";

fbxdocinfo.mauthor = "bytework";

fbxdocinfo.mrevision = "1.0";

fbxdocinfo.mkeywords = "export mesh materials textures uvs";

fbxdocinfo.mcomment = "";

fbxscene.setsceneinfo(fbxdocinfo);

fbxglobalsettings globalsettings = fbxscene.getglobalsettings();

globalsettings.setsystemunit(fbxsystemunit.cm);

globalsettings.setaxissystem(fbxaxissystem.mayayup);

然後是乙個list類似的樹狀結構,每個根節點記錄了該物體的名稱,然後是子節點,乙個物體包括多個子節點,包括mesh renderer,transform等節點資訊,節點資訊裡有屬性等細節資訊。

要寫fbx檔案,首先就是fbx sdk的封裝,autodesk官網提供了fbx的核心sdk,但是是c++版本的,需要對它進行一次c#封裝,封裝完之後就是unity端,c#匯出指令碼的編寫了,我們要把unity的物體匯出為fbx就需要把unity物體的每個元件都轉換為fbx格式的元件,然後再寫入fbx檔案。這就需要我們手動對每個元件進行一次轉換。例如unity中的vector3,對應fbx中的就是fbxdouble3,unity中物體的旋轉就是乙個四元數,對應fbx的fbxquaternion 。unity中的animationcurve 對應fbx中的fbxanimcurve等。

sdk封裝和轉換指令碼寫完後就可以進行實際的匯出了,流程就是首先獲取unity場景中的乙個物體,然後獲取該物體的所有子物體,對這些物體按找層級關係,寫入乙個fbxnode,節點名字就是物體名字,然後輸出每個物體的tranform元件,將其寫入fbx中,因為每個物體都必定會有這個節點。

public static fbxvector4 convertquaterniontoxyzeuler(fbxquaternion quat)

protected bool exporttransform(transform unitytransform, fbxnode fbxnode, vector3 newcenter, transformexporttype exporttype)

fbxvector4 val3 = converttorighthanded(lefthandedvector, 100f);

fbxdouble3 val4 = default(fbxdouble3);

val4 = new fbxdouble3(val2.x, val2.y, val2.z);

fbxnode.lcltranslation.set(new fbxdouble3(val3.x, val3.y, val3.z));

fbxnode.lclrotation.set(val);

fbxnode.lclscaling.set(val4);

return true;

}

如果這個物體是空物體,那麼這個物體就匯出成功了。接著再次迴圈物體,得到每個物體獨有的元件,將其寫入對應fbx節點。

例如下面的**就是匯出材質球的顏色的方法

public fbxdouble3 getmaterialcolor(material unitymaterial, string unitypropname, float defaultvalue = 1f)

if (!unitymaterial.hasproperty(unitypropname))

color color = unitymaterial.getcolor(unitypropname);

return new fbxdouble3(color.r, color.g, color.b);

}

Unity場景物體路徑複製外掛程式

下邊有一部分設計unity編輯器擴充套件,這裡找了乙個寫的比較全面的文章 直接選中場景中的某個物體,然後使用copypath功能。這裡有三種方式,一 選單欄 gameobject copy path 二 右鍵 copy path 三 預設快捷鍵 ctrl 1 可以自己在 裡修改 複製完後,可以直接去...

Unity 通過XML儲存場景物體資訊

在專案工程中,將此指令碼放置editor資料夾中即可,在選單欄中可以使用該命令匯出場景資訊內容儲存為xml,檔案儲存到streamingassets資料夾中。using system.io using system.xml using unityeditor using unityeditor.sc...

unity3d小技巧之鎖定場景物體防止被誤選中

其實很多人應該早知道了,但是我今天才知道 其實這個功能很實用,就像圖層一樣 用過cg軟體之類的人應該清楚當場景物體很多的時候 需要有些物體可見調整視覺效果,但是不希望它們被選中影響其他物體 所以希望一些物體在不同的 層 這個功能也正是unity中的層來控制的 如圖里右上角的layers裡面可以在眼睛...