はじめに。
ゲーム作ってみたいな~と思い、つい先日からUnityをさわり始めましたHITOMI2236です。今回ブレンドシェイプについて調べたのでここに記録しようと思います。個人用のメモですが、もし同じところで迷っている人がいたら、時間短縮のために読んでくれたら幸いです。
1 . ブレンドシェイプのモデルについて
ブレンドシェイプ検証用にMayaで簡単なモデルを作りました。HumanIKの各関節部分にCubeを配置しただけのモデルです。頭部の部分に簡単なブレンドシェイプをつけており、わかりやすくするために名前を「face_object」に変更しています。
blendShape_01_01.png
これをFBXで書き出します。書き出す時にはもちろんですがアニメーション項目ないのブレンドシェイプのチェックボックスをオンにしましょう。私は結構忘れます。
書き出したFBXをUnityにドラッグアンドドロップしてPrefab化し、Hierarchyに追加します。
ブレンドシェイプがついてるオブジェクトを確認してみるとInspecterに「Skinned Mesh Render」という項目が表示されているのがわかります。その中にBlendShapesという項目があり、どうやらこの数値を増やすと形が変形するようです。
2 . ブレンドシェイプを制御するプログラム。
モデルの名前は「blendShapeCharacter」,
ブレンドシェイプ情報を持っているオブジェクト名は「face_object」です。
「face_object」が持っているブレンドシェイプの名前は「blendShape1.blendAction」です。
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassblenderShapeControll:MonoBehaviour{publicGameObjecthead;publicSkinnedMeshRendererskinnedMeshRenderer;privatefloatm_weight;privateintm_Index;voidStart(){m_weight=0;head=GameObject.Find("blendShapeCharacter/face_object");skinnedMeshRenderer=head.GetComponent<SkinnedMeshRenderer>();m_Index=skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape1.blendAction");}voidUpdate(){if(Input.GetKey(KeyCode.A)){if(m_weight==0){m_weight=100;}else{m_weight=0;}skinnedMeshRenderer.SetBlendShapeWeight(m_Index,m_weight);}}}
Aボタンを押すとブレンドシェイプが100と0に切り替わるシンプルなプログラムです。
GameObject.Find("blendShapeCharacter/face_object");
ここでブレンドシェイプの情報を持っているオブジェクトを検索して、
skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape1.blendAction");
ここでそのオブジェクトが持っているスキンメッシュのインデックスを取得しているようです.
skinnedMeshRenderer.SetBlendShapeWeight(index, weight);
SetBlendShapeWeightで対象のウェイトを操作する。
以上のような手順?になりました。
最後に
多分クラス化しようと考えているので、フェイシャルのブレンドやインデックスの一覧取得方法など調べてみようかなと考えています。
趣味で3D作品を作っています。もしよければ見て上げてください。星つけてくれたら嬉しいな!
そして、フレンドになって技術共有しましょう!
sketchfab