您好,登錄后才能下訂單哦!
如何在Unity3d中實現MAYA的BlendShape,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
接下來會詳細介紹具體的導出設置和導入后如何進行控制。 首先科普下BlendShape(只針對于木有接觸過三維動畫的人,如果非常熟悉請直接略過)。本想在百度上找一篇相對比較官方的解釋,但發現度娘不樂意告訴,無奈只能去老外那里搜點資料。果然皇天不負有心人,還真被我找到啦。不過要為難那些英語不是很好的朋友們啦,因為原文時英文的,本小白最近略忙,后續會為大家奉上翻譯版。BlendShape相關資料。總的來說BlendShape是用于變形物體的一種特殊方式,在三維動畫領域常用于做表情動畫,當然也可以用來做一些非常規動畫效果。
首先打開MAYA,創建一個CUBE(此處模型相對比較簡單,只是使用了CUBE并簡單調了一下點的位置,主要是為了說明原理和步驟。本小白相信各位偉大的看官藝術家肯定能做出比本小白好得多的效果)。CRTL+D(復制)一份,調節一下復制品的頂點。截圖如下。
之后先選中Deformable物體,再選中Base物體(此處的順序非常重要,一定要先選擇變形物體,在選擇基礎物體,否則之后創建的變形效果也會反過來)點擊菜單欄Create Deformers > BlendShape(若沒有此菜單請切換到Animation模塊再嘗試),此步驟截圖如下。
創建成功后,選擇基礎物體(也即非變形物體)執行File > ExportSelection選擇FBX格式,關于選項有幾點需要說明: 1)激活Animation選項; 2)在其下激活Deformed Models; 3)下面繼續看激活Deformed Models及其下的Skins與Blenshapes,最后選擇Export。設置詳情見下圖。
之后切換到U3D中,新建一個工程,導入我們從MAYA中導出的FBX文件。選中模型在ImportSettings中設置合適的ScaleFactor,其余選項可以暫時保持默認或者根據您的需要進行調節。本小白比較懶,所以保持默認啦。之后關鍵的來啦。。。。。。。。 將導入的模型從Projec中拖動到Hierachy中,可以看到在Inspector中Skinned Mesh Renderer組件中(小白有些不太明白為何此處會被成為Skinned Mesh Renderer,明明模型中沒有包含Bone。莫非U3D會把所有非Transform動畫都當做Skinned Mesh????? 不過咱們不糾結這些東西),在BlendShapes下會有一個默認的屬性,本小白的被成為“blendShape1.pCube2”,這是U3D默認的起得屬性名,本小白在此又犯懶啦,所以沒有改。望各位看官見諒。現在可以調節該屬性即可在Viewport中看到BlendShape的效果。對于基礎相對薄弱的看官看到此處就OK啦,對于有強烈求知欲的看官,請您接著往下看。 通過上面的步驟我們可以通過屬性控制BlendShape。那么問題來啦,我們能否在游戲運行過程中動態更改呢?答案必須是肯定的,要不然各位看官該打小白啦。小白想到的思路有兩種:1)通過關鍵幀動畫和動畫狀態機結合來控制BlendShape。(對于小白這種非程序員出身的人來說似乎足夠啦,但是作為CSDN這么高大上的地方只有界面操作而沒有程序似乎沒有那么高大上,故此又繼續進一步,研究了一下腳本);2)使用腳本動態控制。由于小白使用的時C#,還煩請各位JS看官自行腦補。腳本如下(由于第一次在CSDN這么高大上的地方發表文章還沒搞清楚怎么添加腳本,見諒見諒)。
using UnityEngine; using System.Collections; public class BlendShape : MonoBehaviour { // 此處用于控制融合的速度 public float blendSpeed = 1; // 定義與BlendShape相關的組件 private SkinnedMeshRenderer skinMesh; private Mesh mesh; void Awake() { // 獲取與BlendShape相關的組件 skinMesh = GetComponent<SkinnedMeshRenderer>(); mesh = skinMesh.sharedMesh; // Debug.Log(skinMesh.GetBlendShapeWeight(0)); // Debug.Log(mesh.blendShapeCount); } void Update() { // 通過簡單的Lerp函數來進行BlendShape權重的漸變 if(skinMesh.GetBlendShapeWeight(0) <= 100) { float weight = Mathf.Lerp(skinMesh.GetBlendShapeWeight(0), 100, Time.deltaTime * blendSpeed); skinMesh.SetBlendShapeWeight(0, weight); } }
可能有些看官會有疑問,為什么此處的最大值時100,而不是1.這就是小白最后要說的一個注意點啦。各位看官還記不記得我們之前剛導入模型到U3D時設置了ScaleFactor。這個設置會影響BlendShape的權重參數(blendShape1.pCube2)。小白的ScaleFactor設置成了100,故此處的參數也會同樣縮放到0-100的范圍。 在結束之前,稍微總結那么一下下:從SkinnedMeshRender組件中獲取BlendShape的權重屬性,當BlendShape多余1個時還需要從Mesh中拿到blendShapeCount屬性。
關于如何在Unity3d中實現MAYA的BlendShape問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。