如何在Unity3d中實(shí)現(xiàn)MAYA的BlendShape,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
目前創(chuàng)新互聯(lián)建站已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、青秀網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
接下來會(huì)詳細(xì)介紹具體的導(dǎo)出設(shè)置和導(dǎo)入后如何進(jìn)行控制。 首先科普下BlendShape(只針對(duì)于木有接觸過三維動(dòng)畫的人,如果非常熟悉請(qǐng)直接略過)。本想在百度上找一篇相對(duì)比較官方的解釋,但發(fā)現(xiàn)度娘不樂意告訴,無奈只能去老外那里搜點(diǎn)資料。果然皇天不負(fù)有心人,還真被我找到啦。不過要為難那些英語不是很好的朋友們啦,因?yàn)樵臅r(shí)英文的,本小白最近略忙,后續(xù)會(huì)為大家奉上翻譯版。BlendShape相關(guān)資料??偟膩碚fBlendShape是用于變形物體的一種特殊方式,在三維動(dòng)畫領(lǐng)域常用于做表情動(dòng)畫,當(dāng)然也可以用來做一些非常規(guī)動(dòng)畫效果。
首先打開MAYA,創(chuàng)建一個(gè)CUBE(此處模型相對(duì)比較簡(jiǎn)單,只是使用了CUBE并簡(jiǎn)單調(diào)了一下點(diǎn)的位置,主要是為了說明原理和步驟。本小白相信各位偉大的看官藝術(shù)家肯定能做出比本小白好得多的效果)。CRTL+D(復(fù)制)一份,調(diào)節(jié)一下復(fù)制品的頂點(diǎn)。截圖如下。
之后先選中Deformable物體,再選中Base物體(此處的順序非常重要,一定要先選擇變形物體,在選擇基礎(chǔ)物體,否則之后創(chuàng)建的變形效果也會(huì)反過來)點(diǎn)擊菜單欄Create Deformers > BlendShape(若沒有此菜單請(qǐng)切換到Animation模塊再嘗試),此步驟截圖如下。
創(chuàng)建成功后,選擇基礎(chǔ)物體(也即非變形物體)執(zhí)行File > ExportSelection選擇FBX格式,關(guān)于選項(xiàng)有幾點(diǎn)需要說明: 1)激活A(yù)nimation選項(xiàng); 2)在其下激活Deformed Models; 3)下面繼續(xù)看激活Deformed Models及其下的Skins與Blenshapes,最后選擇Export。設(shè)置詳情見下圖。
之后切換到U3D中,新建一個(gè)工程,導(dǎo)入我們從MAYA中導(dǎo)出的FBX文件。選中模型在ImportSettings中設(shè)置合適的ScaleFactor,其余選項(xiàng)可以暫時(shí)保持默認(rèn)或者根據(jù)您的需要進(jìn)行調(diào)節(jié)。本小白比較懶,所以保持默認(rèn)啦。之后關(guān)鍵的來啦。。。。。。。。 將導(dǎo)入的模型從Projec中拖動(dòng)到Hierachy中,可以看到在Inspector中Skinned Mesh Renderer組件中(小白有些不太明白為何此處會(huì)被成為Skinned Mesh Renderer,明明模型中沒有包含Bone。莫非U3D會(huì)把所有非Transform動(dòng)畫都當(dāng)做Skinned Mesh????? 不過咱們不糾結(jié)這些東西),在BlendShapes下會(huì)有一個(gè)默認(rèn)的屬性,本小白的被成為“blendShape1.pCube2”,這是U3D默認(rèn)的起得屬性名,本小白在此又犯懶啦,所以沒有改。望各位看官見諒?,F(xiàn)在可以調(diào)節(jié)該屬性即可在Viewport中看到BlendShape的效果。對(duì)于基礎(chǔ)相對(duì)薄弱的看官看到此處就OK啦,對(duì)于有強(qiáng)烈求知欲的看官,請(qǐng)您接著往下看。 通過上面的步驟我們可以通過屬性控制BlendShape。那么問題來啦,我們能否在游戲運(yùn)行過程中動(dòng)態(tài)更改呢?答案必須是肯定的,要不然各位看官該打小白啦。小白想到的思路有兩種:1)通過關(guān)鍵幀動(dòng)畫和動(dòng)畫狀態(tài)機(jī)結(jié)合來控制BlendShape。(對(duì)于小白這種非程序員出身的人來說似乎足夠啦,但是作為CSDN這么高大上的地方只有界面操作而沒有程序似乎沒有那么高大上,故此又繼續(xù)進(jìn)一步,研究了一下腳本);2)使用腳本動(dòng)態(tài)控制。由于小白使用的時(shí)C#,還煩請(qǐng)各位JS看官自行腦補(bǔ)。腳本如下(由于第一次在CSDN這么高大上的地方發(fā)表文章還沒搞清楚怎么添加腳本,見諒見諒)。
using UnityEngine; using System.Collections; public class BlendShape : MonoBehaviour { // 此處用于控制融合的速度 public float blendSpeed = 1; // 定義與BlendShape相關(guān)的組件 private SkinnedMeshRenderer skinMesh; private Mesh mesh; void Awake() { // 獲取與BlendShape相關(guān)的組件 skinMesh = GetComponent(); mesh = skinMesh.sharedMesh; // Debug.Log(skinMesh.GetBlendShapeWeight(0)); // Debug.Log(mesh.blendShapeCount); } void Update() { // 通過簡(jiǎn)單的Lerp函數(shù)來進(jìn)行BlendShape權(quán)重的漸變 if(skinMesh.GetBlendShapeWeight(0) <= 100) { float weight = Mathf.Lerp(skinMesh.GetBlendShapeWeight(0), 100, Time.deltaTime * blendSpeed); skinMesh.SetBlendShapeWeight(0, weight); } }
可能有些看官會(huì)有疑問,為什么此處的最大值時(shí)100,而不是1.這就是小白最后要說的一個(gè)注意點(diǎn)啦。各位看官還記不記得我們之前剛導(dǎo)入模型到U3D時(shí)設(shè)置了ScaleFactor。這個(gè)設(shè)置會(huì)影響B(tài)lendShape的權(quán)重參數(shù)(blendShape1.pCube2)。小白的ScaleFactor設(shè)置成了100,故此處的參數(shù)也會(huì)同樣縮放到0-100的范圍。 在結(jié)束之前,稍微總結(jié)那么一下下:從SkinnedMeshRender組件中獲取BlendShape的權(quán)重屬性,當(dāng)BlendShape多余1個(gè)時(shí)還需要從Mesh中拿到blendShapeCount屬性。
關(guān)于如何在Unity3d中實(shí)現(xiàn)MAYA的BlendShape問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。