Unity
MMD

UnityでPerception Neuronを使ってMMDモデルを動かす

More than 3 years have passed since last update.


はじめに

UnityでPerception Neuronを使ってMMDモデルを動かす手順について書きます。「Perception Neuronって何?」という方は「MMM(MikuMikuMoving)でPerception Neuronを使う」を先に目を通していただくとよいかと思います。


作業の流れ

Perception Neuronの公式サイトでUnity向けのSDKが公開されています。基本的にはそちらのパッケージを利用すればよいのですが、Perception NeuronとMMDモデルではデフォルトポーズが異なっているため(NeuronはTスタンス、MMDモデルはAスタンス)、その部分に関して調整する必要があります。

調整する方法としては

- MMDモデルを事前にAスタンスからTスタンスに変形させる

- プログラム実行時にデフォルトポーズの違いを吸収する

という二つの方法があるかと思います。

MMM(MikuMikuMoving)でPerception Neuronを使う」では、「プログラム実行時にデフォルトポーズの違いを吸収する」方法で調整しました。ここでは「MMDモデルを事前にAスタンスからTスタンスに変形させる」方法で調整したいと思います。


MMDモデルをTスタンスに変形させる

はじめにMMDモデルを用意します。ここではTda式初音ミクを使わせていただきます。

モデルのデフォルトポーズを変形させるためにPMXエディタを使用します。

MMDモデルをPMXエディタで開きましょう。

001.PNG

TransformViewを開きます。

002.PNG

右肩、右腕、左肩、左腕のZ軸の角度を調節してTスタンスに変形します。

003.PNG

「ファイル」→「現在の形状で保存」を選択し、適当に名前を付けて保存しましょう。

010.png


MMDモデルをUnityで使用する

Noraさん(@Stereoarts)のMMD4Mechanimを使うことで、UnityでMMDモデルを使うことができます。MMD4MechanimはStereoarts Homepageからダウンロードすることができます。詳しい使い方はこちらに載っています。

Unityで適当な名前でプロジェクトを新規作成します。

004.PNG

エディタが開きます。

005.PNG

プロジェクトのAssetsフォルダの下にMMDモデルのファイル一式をコピーします。

006.PNG

MMD4Mecanimをインポートします。

007.PNG

変換するMMDモデルを選択し、利用規約を確認の上Processボタンを押します。VMDは空で構いません。

009.PNG

生成されたモデルを選択し、RigのAnimation TypeをHumanoidに変更し、Applyボタンを押します。

011.png

モデルをシーンに配置します。MMD4MechanimModelスクリプトのPhysics EngineをBullet Physicsに変更しておきましょう。

012.PNG


Perception NeuronのSDKを使用する

Perception Neuronの公式サイトからUNITY SDKをダウンロードしましょう(2016/3/5現在UNITY SDK 0.2.5が最新版です)。ダウンロードできたらインポートします。

013.PNG

下記ダイアログが表示されたら、「I Made a Backup.Go Ahead!」を選択してください。

014.PNG

Assets/Neuron/Scripts/Mocap内のNeuronAnimatorInstanceスクリプトをモデルにアタッチします。Connect To Axisにチェックを入れてください。

015.PNG


Axis Neuronの準備

Perception Neuronの公式サイトからAxis Neuronをダウンロードしましょう(2016/3/5現在Axis Neuron 2740が最新版です)。Axis Neuron Proを持っている方はそちらでもかまいません(2016/3/5現在Axis Neuron Pro 3903が最新版です)。

SettingsのBroadcastingでBVHにチェックを入れます。

016.PNG

ボーンの角度情報のみを使用するため、位置情報は外す必要があります。SettingsのOutput FormatのDisplacementのチェックを外します。(Displacementにチェックが付いているとボーンの位置情報も使用されてしまうため、モデルが恐ろしいことになります。。)

017.PNG

適当なモーションを再生させておきましょう。

018.PNG

Unity側に戻って実行してみましょう。モーションが適用されていればOKです。

019.PNG

2016/3/5現在UNITY SDKにバグがあるようで、しばらく動かしてるとモデルの親指が荒ぶりだします。

020.PNG

仕方がないので親指ボーンへの角度の設定をコメントアウトします。右親指、左親指両方ともやっておきましょう。(それでも長時間動かしてるとダメっぽいです)


NeuronAnimatorInstance

        // right hand

SetRotation( animator, HumanBodyBones.RightHand, actor.GetReceivedRotation( NeuronBones.RightHand ) );
// SetRotation( animator, HumanBodyBones.RightThumbProximal, actor.GetReceivedRotation( NeuronBones.RightHandThumb1 ) );
// SetRotation( animator, HumanBodyBones.RightThumbIntermediate, actor.GetReceivedRotation( NeuronBones.RightHandThumb2 ) );
// SetRotation( animator, HumanBodyBones.RightThumbDistal, actor.GetReceivedRotation( NeuronBones.RightHandThumb3 ) );

こんな感じになります。



VR対応

ついでにVR対応させてみましょう。PERCEPTION NEURON UNITY HANDBOOKの「HMD INTEGRATION」の章には次のように書かれています。



  1. The rotation tracker of the HMD should always have priority. Don’t overwrite its rotation values with something else and don’t use the head rotation values from the Perception Neuron system.

  2. Don’t use the positional tracking of the HMD.

  3. Never parent the HMD cameras or GameObjects to the skeleton setup.


※「PERCEPTION NEURON UNITY HANDBOOK」の「HMD INTEGRATION」より引用

以下の方法を推奨しているようです。

・頭の回転はHMDから取れる値を使う。Perception Neuronから取れる値は使わない。

・頭の位置はPerception Neuronから取れる値を使う。HMDのポジトラの値は使わない。

以下にVR向けのシンプルなスクリプトが用意されています。

Assets/NeuronExamples/OVRExample/NeuronOVRAdapter

PERCEPTION NEURON UNITY HANDBOOKには以下のように書かれています。


● On every new frame we position the OVR Camera Rig to the same position as the head target object.

● This target object is an empty GameObject inside the Head skeleton hierarchy. We use the target object to provide an easy way to define an offset and to set the correct position on the head.

● Since we never change the rotation of the OVR Rig you need to reset its tracker once you have the HMD on your head. This way the rig will be aligned correctly with your virtual body. Make sure you’re facing forward when resetting the Oculus tracker. (Note: you need to code the reference to the OVRManager yourself in order to reset

the OVR pose).


※「PERCEPTION NEURON UNITY HANDBOOK」の「HMD INTEGRATION」より引用

頭のボーンの階層にOVRCameraTargetという名前で空のGameObjectを追加します。位置は後で微調整しましょう。

021.PNG

毎フレームVRのカメラの位置をOVRCameraTargetの位置で更新するわけですが、スクリプトで直接カメラの位置や姿勢を変更してもHMDから取れる値で上書きされてしまいます。CameraControllerという名前で空のGameObjectを作って、カメラをその子にしましょう。HMDのポジトラの値を無効にするためにCameraControllerのScaleを(0,0,0)にしておきます。

022.PNG

CameraControllerにNeuronOVRAdapterをアタッチし、Bind TransformにOVRCameraTargetをセットします。

023.PNG

PlayerSettingsのVirtual Reality Supportedを有効にします。

024.PNG

カメラのClipping PlaneのNearをいい感じに調整しておきましょう。

026.PNG

せっかくなので、床とか鏡とか用意してみましょう。鏡はこれを使わせていただきました。

025.PNG

実行してみるとHMDの向きとモデルの向きが合っていません。

HMDとモデルの向きをリセットするスクリプトを作ります。適当なオブジェクトにアタッチしておきましょう。


ResetOrientation

using UnityEngine;

using UnityEngine.VR;
using System.Collections;

public class ResetOrientation : MonoBehaviour {

public GameObject modelRoot;
public GameObject modelHip;

// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.R))
{
InputTracking.Recenter();
modelRoot.transform.rotation = Quaternion.Euler(0, -modelHip.transform.localRotation.eulerAngles.y, 0);
}
}
}


modelRootにはモデルのルートを、modelHipにはモデルのHipをセットしておきます。RキーでHMDもモデルも鏡の方を向きます。

image

こんな感じになります。