LoginSignup
6
3

More than 3 years have passed since last update.

Unity勉強日誌~ブレンドシェイプ操作方法その①

Last updated at Posted at 2020-02-13

はじめに。

ゲーム作ってみたいな~と思い、つい先日からUnityをさわり始めましたHITOMI2236です。今回ブレンドシェイプについて調べたのでここに記録しようと思います。個人用のメモですが、もし同じところで迷っている人がいたら、時間短縮のために読んでくれたら幸いです。

1 . ブレンドシェイプのモデルについて

ブレンドシェイプ検証用にMayaで簡単なモデルを作りました。HumanIKの各関節部分にCubeを配置しただけのモデルです。頭部の部分に簡単なブレンドシェイプをつけており、わかりやすくするために名前を「face_object」に変更しています。
blendShape_01_01.png
blendShape_01_01.png

これをFBXで書き出します。書き出す時にはもちろんですがアニメーション項目ないのブレンドシェイプのチェックボックスをオンにしましょう。私は結構忘れます。

書き出したFBXをUnityにドラッグアンドドロップしてPrefab化し、Hierarchyに追加します。

ブレンドシェイプがついてるオブジェクトを確認してみるとInspecterに「Skinned Mesh Render」という項目が表示されているのがわかります。その中にBlendShapesという項目があり、どうやらこの数値を増やすと形が変形するようです。

blendShape_01_02.png

2 . ブレンドシェイプを制御するプログラム。

モデルの名前は「blendShapeCharacter」,
ブレンドシェイプ情報を持っているオブジェクト名は「face_object」です。
「face_object」が持っているブレンドシェイプの名前は「blendShape1.blendAction」です。

skinShape.rb
using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class blenderShapeControll : MonoBehaviour {
    public GameObject head;
    public SkinnedMeshRenderer skinnedMeshRenderer;
    private float m_weight;
    private int m_Index;


    void Start() {

        m_weight = 0;
        head = GameObject.Find("blendShapeCharacter/face_object");
        skinnedMeshRenderer = head.GetComponent<SkinnedMeshRenderer>();
        m_Index = skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape1.blendAction");

    }

    void Update() {

        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

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3