Unityで映像制作Tips(3Dキャラクターモデル編)


自己紹介

こんにちはゆずです。@Yuzu_Unity

はじめに

今回はUnityというよりは3DCGのお話です。

目次

1.アニメーションのローパスフィルター
2.ブレンドシェイプ式関節補助
3.テクスチャブレンド機能

アニメーションのローパスフィルター

Neuron等のモーションキャプチャー等を利用すると
加速度センサーの読み取りは途切れ途切れでノイズがあるため
動きがカクカクになる場合があります。なのでローパスフィルターを通します。
※なお動きが滑らかになるのでやりすぎは注意

Unityには線形補完する関数があるためそれを用います。
Vector3.Lerp 
Quaternion.Lerp

???.Lerp(前フレームの値,現在のフレームの値,保管数値(0~1))
保管数値にはTime.deltaTime×好きなfloat値
実際に動かして調整するといいと思います。

TransformLowPass.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformLowPass : MonoBehaviour
{
    public float value;
    public Transform[] bone;
    private Vector3[] tmppos;
    private Quaternion[] tmprot;

    // Start is called before the first frame update
    void Start()
    {
        tmppos = new Vector3[bone.Length];
        tmprot = new Quaternion[bone.Length];
         for(int i=0; i<bone.Length; i++)
        {
            tmppos[i] = bone[i].localPosition;
            tmprot[i] = bone[i].localRotation;
        }
    }

    private void LateUpdate()
    {
        for (int i = 0; i < bone.Length; i++)
        {
            tmppos[i] =Vector3.Lerp(tmppos[i], bone[i].localPosition,value*Time.deltaTime);
            tmprot[i] =Quaternion.Lerp(tmprot[i], bone[i].localRotation,value*Time.deltaTime);

            bone[i].localPosition = tmppos[i];
            bone[i].localRotation = tmprot[i];
        }
    }
}

ブレンドシェイプ式関節補助

3DCGでは関節などに補助ボーンを入れたりして
関節のねじれを修正したり回転時の縮小を直したりします。

Unityにおけるねじれ
UnityのHumanoidにはねじれ対策として
自動的に親に回転値を渡す仕組みがあります。
90度以上ねじれると破綻しますが、それ以下の動きの場合なら
自前で補助ボーンを必要としないといった利点があります。
なので今回はねじれは対策を行いません。

関節の出っ張りをブレンドシェイプ式でなおす。
崩壊3rdでも使われているようですが、関節を曲げた時のメッシュを用意し
それをブレンドシェイプとして設定し曲げ具合によりブレンドします。
(崩壊3rdでは45度90度の二つのブレンドシェイプを用意しているようです。)
補助ボーンを作成するより完成したモデルがあるならコストはないので採用します。

ボーンの回転値に合わせてブレンドシェイプを制御します。

テクスチャブレンド機能

基本的には以前の記事を用います。
このパラメータをブレンドシェイプの値で操作します。
https://qiita.com/Yuzu_Unity/items/2c4e0a19b8fc8dd64209

まとめ

DCCツールではある機能がUnityではないといったことはよくありますが、
Unityではスクリプトが作成しやすいのでその機能を簡単に作れるのがいいですね。