Unity+Oculus+MMD とりあえず書き留めておく場所

Unity+Oculus+MMD VRでキャラクターと遊ぶ

6. HeadLook機能の実装(作業編)

今回は、HeadLook機能の実装作業です。

まず最初に、HeadLook機能がどんな感じなのか「HeadLookController」に同梱されているサンプルSceneを見てみましょう。

Assetフォルダにある「HeadLookController」フォルダを選択すると、右に中身が表示されます。Unityアイコンの「HeadLookTest」というSceneファイルが入っているので、それをダブルクリックします。

f:id:emifuwa:20171124123052j:plain

もしその時点で最初に表示されていた自作のSceneが保存されていない場合は「保存しますか?」と聞いてくるので保存すると、「HeadLookTest」がSceneビューに表示されます。

見やすいようにSceneビューをマウスのスクロールホイールでズームすると、男性のモデルの目の前に黄色いボールがあるのがわかりますね。Hierarchy上では「Target Sphere」という名前になっています。

これを選択して、操作ツール「移動」のボタンを押し、三色の矢印を出現させ、ボールを動かせる状態にしておきます。

f:id:emifuwa:20171124123743j:plain

そのまま「再生」ボタンを押します。

再生状態のままでScene上で矢印をドラッグし、ボールを動かしてみると、モデルの視線がそれについてくるのがわかりますね。

f:id:emifuwa:20171124124041j:plain

これが目指すところになります。手順としては、

①モデルに「HeadLookController」機能を付ける。設定を調整する。

②カメラ(=体験者)に、Controllerのターゲットになる機能を付ける。

という感じになります。

もちろん、このテストのように、カメラではないオブジェクトをターゲットに設定すれば、モデルはそれを追いかけるようになります。

では、とりあえず元のSceneに戻りましょう。

Assetフォルダに作っておいた「Scene」フォルダから自作のSceneを選択し、ダブルクリックすれば、また表示が元のSceneに戻ります(もちろん、メニューバー→FileからSceneを指定して開いても構いません)。

では、まずモデルの設定から。

モデルにHeadLookControllerをアタッチする

Hierarchy上でモデルを選択すると、Inspectorにモデルのコンポーネントが表示されます。

今のところは「Transform」「Animator」「MMD4Mechanim Model (Script)」というコンポーネントで構成されていると思いますが、スクロールして一番下を見ると、「Add Component」というボタンがあるのがわかります。

f:id:emifuwa:20171124125912j:plain

コンポーネントを増やしていくことで、オブジェクトが色んな機能を持つようになっていきます。

モデルが任意のオブジェクトの方を向くために、「HeadLookController」コンポーネントをアタッチしましょう。

「Add Component」を押すと、このような選択ウィンドウが表示されます。

f:id:emifuwa:20171124130439j:plain

種類別に分類されている中から探してもいいのですが、今回は目当てのスクリプトの名前がわかっているので、上の検索ボックスにhe~とでも入力すれば、すぐに候補が表示されます。

f:id:emifuwa:20171124130722j:plain

見つけたら、それをクリックすれば、コンポーネントがアタッチされます。

f:id:emifuwa:20171124131029j:plain

※直接HeadLookControllerのフォルダを開き、「Script」フォルダからスクリプトをHierarchy上のモデルの上にD&Dすることでも、コンポーネントをアタッチすることが出来ます。

HeadLookControllerの設定

まずは、モデルの頭(頭ボーンと首ボーン)がオブジェクトを追うように設定します。

f:id:emifuwa:20171124181615j:plain

HeadLookControllerのコンポーネント「Segments」「Size」が「0」になっているところを、「1」と入力してください。

ここの数値を増やすと、設定項目の欄が増えていきます。

とりあえずは頭部分だけということで、1にしておきます。

1を入力してEnterを押すと、下に「Element 0」という入力欄が増えました。

f:id:emifuwa:20171124182456j:plain

上から順番に設定していきましょう。

「First Transform」「Last Transform」には、動かすボーンを設定していきます。

f:id:emifuwa:20171124183300j:plain

入力ボックスの右にある◎ボタンを押すと、選択肢が表示されます。

f:id:emifuwa:20171124185142j:plain

First Transform:joint_Neck

Last Transform:joint_Head

を、それぞれ指定してください(前についている番号は、モデルによって異なります)。

その下の数値は、とりあえず以下の通りに入力してください。

f:id:emifuwa:20171124185920j:plain

Threshold Angle Difference:5

Bending Multiplier:0.7

Max Angle Difference:5

Max Bending Angle:50

Responsiveness:5

なお、これらの設定に関する詳しい内容は、Someluさんの以下の記事が詳しいです。

qiita.com

設定が終わると、このようになっているはずです。

f:id:emifuwa:20171124190631j:plain

※一番下の項目「Effect」は、機能の効果の度合いを指しています。

例えばこちらの数値を0.8にしたりすると、HeadLookの効きが鈍くなります。とても愛想のいいキャラクターなら、1.2くらいに増やしてもいいかもしれません。

※モデルによってはHeadLookがうまくいかず、頭がぐるぐる回転してしまうことがあるのですが、そんな時に「Overrride Animation」にチェックを入れると、うまくいくかもしれません。

ターゲットになるオブジェクト(カメラ)の設定

次は、ターゲットになるオブジェクト(ここではMain Camera)に、ターゲットになるようなコンポーネントをアタッチします。

こりんさんのこちらの記事で紹介されているコードを使います。

framesynthesis.jp

まず、カメラにアタッチするためのスクリプトを作ります。

作成するスクリプトは、前回BlendShapeBlinkを仕舞っておくために作った「Script」フォルダの中に保存することにしましょう。

Assetフォルダの中のScriptフォルダを選択し、Projectビューの上で右クリックすると出るメニューから「Create」→「C#Script」を選択。

f:id:emifuwa:20171124205735j:plain

すると、こんな感じで新規のスクリプトファイルが出来ます。

f:id:emifuwa:20171124205852j:plain

とりあえず、ファイル名は「Target」にしておきましょう。

f:id:emifuwa:20171124210059j:plain

そして、「Target」をダブルクリック。

すると、MonoDevelopというアプリケーションが自動的に開きます。

Unityをインストールすると付いてくる、スクリプト編集エディタです。

f:id:emifuwa:20171124210514j:plain

 新規のスクリプトはこんな感じで表示されていますが、とりあえずこの中身を全部削除し、上の記事で紹介されているコードをそのままコピペします。

using UnityEngine;

public class Target : MonoBehaviour
{
    public HeadLookController controller;

    void LateUpdate()
    {
        controller.target = transform.position;
    }
}

f:id:emifuwa:20171124211824j:plain

全選択→

f:id:emifuwa:20171124211854j:plain

上記コードをコピーしてペースト→保存

f:id:emifuwa:20171124211959j:plain

 記号が抜けている…などのコピペミスがなければ、これで「Target」スクリプトは出来上がりです。

(※何か抜けがあったりした場合、スクリプトを保存した段階でUnity画面左下に赤いエラーが出ます)

 それでは、出来上がったスクリプトをMain Cameraにアタッチしましょう。

Hierarchy上のMainCameraを選択し、Inspectorの一番下「Add Component」から、Targetスクリプトを探してアタッチしてもいいですし、出来上がったスクリプトを直接オブジェクトにD&Dしてもアタッチできます。

f:id:emifuwa:20171124212905j:plain

追加できれば、Main CameraのInspectorはこうなっているはずです。

f:id:emifuwa:20171124213233j:plain

「Controller」という項目に、対象となるモデルを設定しましょう。

f:id:emifuwa:20171124213733j:plain

右の候補選択ボタンを押して、該当モデルを選びます。

または、Hierarchy上のモデルの名前を選択→「None」と書いてある欄に直接D&D…でも設定できます。

f:id:emifuwa:20171124214003j:plain

「Controller」の部分にモデル名を設定できたら、準備完了です。

再生ボタンを押して、Rift本体を色んなところに動かして試してみましょう。

設定が間違ってなければ、モデルの頭がちゃんとカメラの動きに応じて追いかけてくれるようになっているはずです。

f:id:emifuwa:20171124221203j:plain

頭がぐるぐる回転しちゃう!という人は、前述の通り

モデルのHeadLookControllerコンポーネントの一番下にOverride Animationにチェックを入れましょう。

※また、モーションがちゃんと再生される状態になっていない場合、うまく動かない時があります。モーション再生から設定し直しましょう。

※頭が横を向くモーションを作っても、基本的にはHeadLookに上書きされてしまいます。なので、そっぽを向いてほしい時にも常にこっちを向いた状態になってしまいます。

このあたりは、Unity上でモーションにレイヤーを作り、HeadLookのEffectの値を操作することによって調節が可能です(下の説明は自分メモ用なので、あとでもっとわかりやすく記事を立てるかもしれません)。

bvillage.hatenablog.com

HeadLookControllerのコンポーネントを増やす

現時点では、モデルの「頭」が体験者(カメラ)の方を向くように設定されていますが、これを「上半身」や「視線(目ボーン)」も動くようにしたいと思います。

まず、HeadLookControllerのコンポーネントを増やします。

最初にコンポーネントをアタッチした時と同じく、「Add Component」からスクリプト名を探して増やすか、スクリプトの入っているフォルダから、スクリプトを直接Hierarchy上のモデルの上にD&Dすることで、新しくコンポーネントを増やすことが出来ます。

手順通りSegmentsに1を入力してElements欄を作ります。

上半身の設定は以下の通り。

First Transform:joint_Torso

Last Transform:joint_Torso2

f:id:emifuwa:20171128111803j:plain

Threshold Angle Differenceなどの数値を変えると、かなり動き方が変わります。

キャラクターの性格などによって、ちょうどいい数値を探すといいでしょう。

qiita.com

 

次に、目ボーンの設定に挑戦してみましょう。

またコンポーネントを増やします。

右目左目の設定が必要なため、ここでもSegmentの数値は2にします。Elementが2つになりました。

①First Transform:joint_RightEye

 Last Transform:joint_RightEyeTip

②First Transform:joint_LeftEye

 Last Transform:joint_LeftEyeTip

f:id:emifuwa:20171128112715j:plain

※モデルに上半身2(Torso2)がない・目の先ボーン(EyeTip)がない…などの場合は、PMXエディタなどで付与した方が早い気がします。

※モデルの構造によってはHeadLookと相性が悪く、頭と上半身はいいけど目だけ上手く動かない・コンポーネント1枚分しか動かない…などの結果が生じることがあります。(経験上、ほとんどのモデルはコンポーネント1枚まではしっかり動きます)

もしコンポーネントを追加していくうちに、再生がうまくできなくなったり(再生ボタンを押すと同時に一時停止ボタンも付いてしまう、など)した場合、原因がどこなのか見極めるために、コンポーネントのチェックを外してみましょう。

f:id:emifuwa:20171128103139j:plain

すると、チェックの外れたコンポーネントは一時的に機能しなくなるため、どこが問題なのか切り分けがしやすくなります。

また、オブジェクト自体のチェックを外すと、そのオブジェクトは非表示になります。

f:id:emifuwa:20171128104005j:plain

便利な機能なので、覚えておきましょう。