【VRChat】MAでRadialを使ったギミックの作り方【Modular Avatar】

VRChat
スポンサーリンク

はじめに

今回はModular Avatar(MA)でExpressions Menuを作る方法を紹介します。
下記の3つを前提に進めます。

・UnityやModula avatarが導入済みである程度使える
・Modula AvatarでMenuを自作できる
・Gesture Manager導入済み

↓前提知識はこちらをご覧ください。

【VRChat】MAでExpressions Menuを作る方法【Modular Avatar】
MA Menu Installerを使うとアバターの既存メニューに新しい要素を差し込めます。そこにMA Menu Itemを使ってModula avatarでメニューの要素を追加。Exp Menuのボタンとトグル以外はMA Parametersでパラメーター設定が必要。

下準備(Blenderで変形用モデルを用意)

今回はBlenderでモデルを用意します。(任意)
モデルがある方は「下準備」を読み飛ばして大丈夫です。

ギミック作成自体はBlenderのモデルがなくても行えます。
ただ表情制作に使われるシェイプキーを動かす方法を紹介したいのでBlenderでモデルを作る所から始めました。

Shift+A → 立方体などを作成。

オプジェクトデータプロパティ → シェイプキーの「+」ボタンを追加。

変形用のシェイプキーを追加しました。

こんな感じで動きます。

シェイプキーを設定したモデルをUnityのプロジェクトにドラッグ&ドロップ。

ヒエラルキーにプロジェクトのモデルをドラッグ&ドロップで配置。

適当な位置に移動。

以上で下準備が完了です。

Expメニューにラジアルを作る

ヒエラルキーを右クリック。
空白のオプジェクトを3つ作り下記のように配置+名前を変更。

Exp Menu
→ 「中身」
 → ラジアル

そしたらデータを管理しやすいようにモデルとヒエラルキーの配置を整理します。

Test(空白のオプジェクト)
 → Test Model(3Dデータ)
 → Exp Menu
   → 「中身」
   → ラジアル

そしたら「中身」に下記のMAを配置。

・MA Menu Installer
・MA Menu Item

MA Menu Itemのタイプを「Sub Menu」に設定
サブメニュー引用元を「子オプジェクトから生成」に設定。

次は「ラジアル」を選択。
MA Menu Itemのタイプを「Radial Puppet」に設定。

以上でExpメニューにラジアルを作る工程が完了です。

ラジアルメニューを作っただけです。
この時点では動かしても「動作」はしません。

これからすることについて

パイメニューからRadial Puppetを使ってアニメーションを再生する機構を作ります。
“Modula Avatarがなかった時代は”下図のような設定で動いてました。

↓MA不使用の設定はこちらで解説。

配線すると下図の位置に対応してます。

・赤色=ラジアルメニューの表示
・緑と黄色=ラジアルメニューをアバターと同期
・オレンジ=入力をパラメーターに変換
・水色=Animatorによる入力受け皿
・白色=パラメーターによる挙動設定(条件分岐)
・藤色=アニメーションの再生

↓文字潰れ対策、画像拡大用Twitter。

ModularAvatarを使う場合は下図の場所を差し替えます。

そしてModularAvatarはヒエラルキーに空白のオプジェクトを作り設定するのが一般的です。
なので置き換え部分の情報はすべて「ヒエラルキー」で設定します。

配線すると下図の位置に対応してます。

・赤色=ラジアルメニューの表示
・オレンジ=ラジアルメニューのパラメーターを入力
・緑色+水色=アニメーションコントローラーで入力情報を処理
・藤色=アニメーションコントローラーでアニメーションを操作
・赤紫色=アニメーションの再生(ギミック情報)
・白色=パラメーターによる挙動設定(条件分岐)

↓文字潰れ対策、画像拡大用Twitter。

別の図で表すと、こんな感じのことをやります。

簡略化すると下記の事をやります。

・ラジアルの入力をParameterに保存
・Parameterの値を受け取りアニメーションコントローラーでアバターを操作

図にするとこちら。
↓何らかの入力=ここではRadialの入力です。

これを行うために下記の3つの処理を作る流れになります。

・ラジアルの入力をParameterに保存
・保存した値をアニメーションコントローラーに送る
・もらった値でアニメーションコントローラーでアバターの状態を操作

以上がこれからすることの解説です。

ラジアルメニューを作って値を保存

まずラジアルメニューの入力を受け取り保存する処理を作ります。

ラジアルの中にMA Menu Itemを作成。
タイプを「Radial Puppet」に設定。
これでラジアルメニューの当たりが入力されます。

次は「ラジアルメニュー用パラメーター名」を設定します。
適当な名前でOKです。
ここでは「Radal」と設定。
これでRadlalというパラメーターの中にラジアルメニューの値が保存されます。

以上がラジアルメニューを作って値を保存する工程です。

ラジアルメニューの値を送る

次は保存したラジアルメニューの値を送る処理を作ります。

Exp Menuを選択。
MA Parametersを追加。

「+」ボタンを使いパラメーターの追加枠を用意。

右側の設定がAnimetorのみは「アニメーター」内の動作専用の値設定です。
これだとパイメニューなどの操作が受け取れません。

なので下記のように設定。

名前 → MA Menu Itemで設定した名前と完全に一致させる
右側 → データ型「Float」を選択

「MA Menu Item」と「MA Parameters」を完全に一致させると値が連動します。

Floatはデータ型の一種です。
VRChatで扱える主なデータ型と範囲は下記の通り。

・Int → 整数(0~255の範囲)
・Float → 少数(-1.0~1.0)
・Bool → スイッチ(1か0を、Ture/Falseで表現)

Floatを設定したのでラジアルメニューの0~100%が少数0.00~1.00に対応。

これでラジアルメニューの値を送る設定ができました。

人によっては送るというより「加工」のほうがピンとくるかもしれません。
お好きに解釈してください。

ラジアルメニューの値をアニコンで受け取る

次は送られたデータをアバター制御回路に受け取るための設定を行います。

ヒエラルキーの一番上にある階層を選択。(Test)
MA Merge Animatorを追加。

モデルより “上にある階層に追加” するのがポイント。

ここの統合されるアニメーターにアニメーションコントローラを入れます。
このアニメーションコントローラーがアバターを動かすための回路です。

プロジェクトを右クリック。
作成 → アニメーションコントローラーを選択。

生成されたアニメーションコントローラーの名前を「New_AniCon」などに設定。

先ほどのMA Merge Animatorにもどります。
作ったAniconを統合されるアニメーターにドラッグ&ドロップ。

次に統合するレイヤーの種類を選択します。
ここでは「FX」を選択。

レイヤーの概要は下記。

・基本(Base) → アバターの基本動作の設定(立ち、しゃがみ、伏せ+移動などの動作)
・Additive → アバターの追加動作(呼吸など)
・Gesture → 『手の形』のみに動作を加える
・Action → エモートなどの完結したアニメーションの再生
・FX → シェイプキーや物のON/OFFの設定+人型ボーン以外の操作設定(耳や尻尾のなど)

・Sitting → 座ってる時のアニメーション指定
・Tpose → アバター視点、手首のねじれ、腕の開き方などの調整、肘を伸ばす等の特殊なモデル調整
・IKPose → 関節の曲がり方の調整。肘や膝のボーンが間違った方向に曲がるモデル調整

主に使うのは下記の4つ。

・Additive(手以外の体)
・Gesture(手)
・Aciton(完結動作)
・FX(人型ボーン以外)


一旦、これだけ覚えたらOKです。

詳細はこちらでまとめてます。

これらにアニメーションコントローラーはすでにアバターに刺さってることがあります。
MA Merge Animatorはすでにある要素に “加算” してアニコン処理を追加します。

VRC Avatar Descriptorを見ると確認できます。
なし(Default)の場合はDefaultに対してMAの加算処理が入ります。

これを使うことでいろんなアバターに同じ動作設定を使いまわせます。

他のMA Merge Animator設定は基本そのままでOKです。
下手に触るとややこしい事になります。

しいて操作するなら不具合が起こったら「レイヤー統合優先度」を調整して様子見。
アバターのWrite Defaluts設定に合わせは基本無効でOKです。
が… もし特殊な動作が必要な場合は任意に選択。

Write Defaultsについて

 → オンだとアニメーション切り替え時に一部のパラメーターが初期化されたりする
 → オフだと切り替え時の初期化が起こらない
 → VRChatではWrite Defaultsは「オフ」が推奨されている
 → オンじゃないとまばたきなどの一部の処理が正しく動かないことがある

Write Defaultsはオンにするなら…
「まばたきを諦める」のが一般的な流れとなってます。
↓このあたりの問題はこちらで解説してます。

あと皆さんが気になりそうなモノで「付属アニメーターの削除」を見ます。
これは有効化のままにします。

有効時は2つの合成されたものが残り、合成に使ったものが消されます。

これがオフだと合成に使ったアニメーターが統合されません。
つまり1つの穴に2つのアニメーションコントローラーが入ります。
これは不具合の原因になるので避けましょう。

これでラジアルメニューの値をアニコンで受け取れます。

受け取った値をアニコンで引き出す

次は受け取った値をアニメーションコントローラーで使えるようにします。
一言で言うと「引き出し処理」を作ります。

プロジェクトで制作したアニメーションコントローラーをダブルクリック。
アニメーターを開きます。

アニメーターの左上にある「パラメーター」をクリック。
右上の「+」 → 引き出したいデータ型を選択。

ここにMA Parametersで設定した名前と完全に一致する名前を入力。
「名前」と「データ型」が完全一致するとMA Parametersの値をアニコンで引き出せます。

以上が受け取った値をアニコンで引き出す処理です。

アニコンにアニメーションを入れて動かす

次はアニメーションコントローラーにアニメーションを入れる設定を行います。
引き出した後の「処理部分」を作ります。

アニメーションコントローラーを選択。
右側の緑色が開始地点です。

開始地点という情報だけなのでここに「動きの記録」情報は入りません。

何もないところを右クリック。
ステートの作成 → 空を選択。

これで開始地点から生成した「ステート」を繰り返し続ける処理が完成しました。

無限ループの状態になるのでアバター使用中は常時「New State」の処理が読み込まれます。

レイヤー名の変更

このようなステートの処理を管理してる部分が「レイヤー」です。

このレイヤーは名前が初期設定のままだと複数のアニメーションコントローラーで名前が被る可能性があります。
名前が被ると意図しないエラーが発生します。

そこでレイヤーの名前を適当なモノに変えます。

ステートの設定調整

生成したステートを選択。
ここにギミック(アニメーション)を記録します。

速度は再生速度の倍率です。

アニメーションデータの中身は「指定した数字に変化情報を記録してるだけ」になります。

数値と変化情報があるだけなので「時間経過で変化」する情報は設定されてません。

ただ0~60という数値だと一般人にはわかりにくいと思います。
なので上側のメモリーには秒数が書かれてます。
(0:00~1:00 → 0秒~1秒)

ステート側でアニメーションの速度を「1」と設定。
これで一般的なアニメーションは「0~60フレーム」が1秒と定義されます。

ちなみに60フレームが1秒かどうかはアニメーションデータの「FPS」で決定されてます。
多くの場合は「60FPS」です。

たまに謎のツールを使ったりすると「30」や「24」FPSになったりします。

次にWrite Defalutsをオフにします。
これはVRChatの必須設定です。

Write Defaultsについて

 → オンだとアニメーション切り替え時に一部のパラメーターが初期化されたりする
 → オフだと切り替え時の初期化が起こらない
 → VRChatではWrite Defaultsは「オフ」が推奨されている
 → オンじゃないとまばたきなどの一部の処理が正しく動かないことがある

そしてMotion Timeの右側にある「パラメーター」を選択。
先ほど設定したパラメーター「Radial」を読み込み。

これでラジアルメニューのパラメーターでモーションタイムが生成されます。

モーションタイムは経過時間でどれだけフレームを動かすかという処理です。
ここにパラメーターを入れると時間経過の代わりにラジアルの数値が使われます。

モーションタイムにパラメータが入ってない場合は普通に時間が入力されてます。

パラメータ設定なし → 60フレーム = 「リアル時間の1秒」を入力してアニメーションする
パラメータ設定あり → 60フレーム → ラジアルの入力を使用して位置を決める


パラメーター設定の場合、時間の影響が無効化されます。

Radialは0.00~1.00の入力で来ます。
これに合わせて記録位置を0~100に設定。
するとアニメーションのフレームが0~100%に対応して動きます。

次はこの動きの記録データ(アニメーション)を設定します。

アニメーションに動作を記録する(ギミック)

プロジェクトの何もないところを右クリック。
作成 → アニメーションを選択。

このアニメーションをステートのインスペクターにある「Motion」に入れます。

生成したアニメーションをダブルクリック。

するとアニメーション記録画面が出てきます。
ただしこの状態ではアニメーションは記録できません。

アニメーションを記録する際はアニコンを記録対象に刺す必要があります。
これで記録できますが…

アニメーションコントローラーを刺す位置が重要になります。
基本はMerge Animatorを設定したところに刺してください。

アニメーションコントローラーを刺すと「Animator」が生成されます。
この「Animator」と「MA Merge Animator」が同じ位置にあればOKです。

アニメーション情報はヒエラルキーの名前(パス)で記録されます。
なのでどこをスタート地点にするかという設定(アニコンを刺す位置)が重要です。

また基本的にアニメーションコントローラーを刺した位置から上のモノは正しく記録できないです。

MA Merge Animatorのパスモードを「絶対的」にすればアバタートップ階層から記録が始まります。

これを使えば上階層のモノを記録できますが…

階層の名前が少しでも変わると動かなくなるので注意。

絶対的設定の用途は主に2つ。

・特定のアバター “専用” のギミック生成(表情など)
・ヒューマノイドボーンなどを動かす
 (ある程度名前が共通してることを前提に操作)

→ ヒューマノイドボーンはアバターによって名前が異なることがあります。
ボーン名が異なると動かなくなるので…
配布の際はそのことを説明書に描くのが親切です。

もし「絶対的」を使う場合はアニコンをアバタートップ階層に刺してください。
参照スタート位置がアバタートップなのでここに刺さないと正しく動きません。

アニコンを刺したらアニメーションが記録できます。
赤い丸を押して記録開始。

タイムライン左上の数値で記録位置を指定。

するとインスペクターで設定できる多くのモノの操作情報を記録できます。
アニコンを設定した下階層すべてインスペクター情報が記録可能。

ここではモデルを選択 → BlendShapsにあるシェイプキー情報を記録します。
1度動かし0に戻すことで「0」の状態を記録。

これでシェイプキーの情報が記録されました。

アニコンを刺したところにできる「Animator」のオンオフ以外のほぼすべては記録可能です。
↓Animatorのオン/オフは操作できないので最初から赤色表示になります。

インスペクターの下にはマテリアル情報があります。
「▶」をクリックして中身を展開。
ここで色やUVオフセットなどの情報も操作できます。

こんな感じでいろいろ初期状態を記録。

次は位置を「100」に設定。
ここに変化情報を記録します。

シェイプキーを100にした値を入力。

他にもマテリアルの色やUVスクロールなどいろいろ設定。

アニメーションの時間軸をマウスで動かします。
これで変化の情報が記録されました。

位置、回転、スケールの記録方法について

Transformを使えば位置、回転、スケールの変化も記録できますが…
なぜか動かなかったり、いろいろ挙動が不安定になったります。

なので位置、回転、スケールはボーンを入れて動かす設定にするのがおすすめ。

あとでボーンを追加した際は名前が変わってアニメーションが動かなくなります。
黄色い文字表示は名前が変わって参照先が無くなったというエラー表示です。

これは選択 → F2キーで名前を調整すれば治ります。

前:「TestModel」 → 「アニメーション情報」
後:「TestModel」 → 「立方体」→ 「アニメーション情報」

ボーンを追加したことで「Test_model」がモデル名からパスの名前に変化。
そしてモデルが「立方体」になったのでこのように設定。

そしたらGesture Managerで動作確認。

ラジアルを操作。
動きました。

動きのカーブ設定

アニメーションの下にある「カーブ」を選択。
すると変化情報がグラフ表示されてます。

よく見るとカーブしてますね。

このカーブは制御点を選択。
その左右に生成される2つ目の制御点で操作できます。

このカーブは変化の歪みを表します。
つまりカーブがあると25の所で25の出力じゃなくなります。

↓下図のような挙動になります。

これは “良い” とされる動きを作るために使われる設定になります。
「イージング」などと呼ばれる処理で動きの緩急を作るのに設定されます。

↓詳細はこちらで解説。

今回はアニメーションをギミックの一部として使います。
なのでこのカーブがあれば動きが意図しない感じなることがあります。

この対策のために直線化する処理をします。

カーブを確認したら「ドーフシート」に戻ります。
Ctrl+Aキーで全てのキーを選択。
何もないところを右クリック → 両接線 → リニアを選択。

カーブに戻って確認。
すると変化がまっすぐになります。

これで入力された値と出力された値の変化、歪みが解決しました。

以上が動きのカーブ設定です。

70%以上の値でオン/オフを切り替える

次は70%でオプジェクトのオン/オフ切り替えギミックを作ります。

これは簡単で「69」の所で表示がオンのアニメーションを記録。
「70」の所で表示がオフのアニメーションを記録で設定できます。

モデルを選択 → インスペクターの左上にあるチェックで表示/非表示を切り替えれます。

Gesture Managerを操作。
これで70%を超えたらモデルが消えるようになりました。

以上がアニコンにアニメーションを入れて動かす設定です。

その他の細かな設定

最後に役立ちそうな設定をまとめます。

2つ以上のレイヤーを使う場合

1つのアニメーションコントローラーにレイヤーは2つ以上設定可能です。
レイヤー表示の状態で「+」で追加。

追加したモノは歯車マークを選択。
ウエイトを「1」に設定。
このウエイト = 1設定がないと動かないので注意。

2つ目以降のレイヤーはウエイトが1じゃないと動きません。

一番最初のレイヤーは自動でウエイトが1になってます。

これでレイヤー影響度が1の状態でアニメーションコントローラーが合成されます。
→ 正しく動くギミックになります。

ボーンや表情のアニメーションを作る(パスの絶対的指定)

MA Merge Animatorのパスモードを絶対的にするとアバター上部の階層から記録が始まります。

こんな感じのイメージです。
※Sig_AddBreathにMA Merge Animatorを刺してます。

このパスの構造や名前が1つでも変わると動かないので注意。

絶対的で記録を行う場合はアニコンをアバタートップ階層に刺します。

するとヒエラルキー上の上にある階層のモノが記録されます。

この絶対的記録は下記の2つで使えます。

・名前がある程度共通しているヒューマノイドボーン
・特定のアバター専用の設定(表情など)

1つ目の用途はヒューマノイドボーンのアニメーション作成。
ヒューマノイドボーンはアバター製作者側である程度命名規則が決まってます。
この名前通りのアバターであれば動きます。

たまに違う名前で設定してるアバターがあるので注意。
全てのアバターに完全に対応は難しいです。

ヒューマノイドボーンのアニメーションはUnityで作るのは難しいです。
値が良くわかないことになってます。

なので制作時はBlenderを利用。(上級者向け)

もしくはUnityのアニメーション生成ツールの利用をおすすめします。

もう1つの用途は「○○専用ギミック」の作成です。
あるアバター専用と割り切れば、名前の不一致問題を気にしなくて良くなります。

顔のメッシュは多くの場合で「Body」という名前になってます。
こちらを選択。

そして中にあるシェイプキーを操作することで「表情アニメーション」を作成できます。

あとはこれまで紹介したギミックの作り方を元に動かすようにします。
(アニメーションコントローラーのステート設定)

以上がボーンや表情のアニメーションを作る(パスの絶対的指定)の解説です。

Radialでアニメーションの再生速度を変える

ラジアルメニューはフレーム位置だけでなく再生速度も変えれます。
まず適当なアニメーションを作りループ再生を有効化。

アニメーション素材はこちらのものを使用。

【無料配布】呼吸アニメーション【VRChat想定】 - しぐにゃもBOOTH - BOOTH
【VRChat想定】呼吸アニメーション/VRC_Breath_Animation

アニメーションの再生速度は「速度」×「乗数」で決まります。
ここでは速度を5、乗数をラジアルのパラメーター入力に設定。

この状態で初期値を「0.2」に設定。
すると5×0.2=1で等速再生になります。

この状態でラジアルメニューを動かすと乗数が変わります。
↓これでアニメーションの再生速度を変えれます。

この仕組みはヒューマノイドボーンの名前が一致してるアバターであれば使いまわせます。
別アバターに移植。

幽狐さんでは動きました。

以上がRadialでアニメーションの再生速度を変える方法です。

ヒューマノイドボーンの特定パーツを動かなくする(アバターマスク)

ヒューマノイドボーンを動かした際、たまに意図しない動きをすることがあります。
たとえば右手を動かしたいだけなのに左手が動いたり…

そのような時に使えるのがアバターマスクです。

これを設定すると特定のパーツだけ動作しない設定が作れます。

アバターマスクはアニメーションコントローラーのレイヤーに差し込みます。
レイヤーの歯車マーク → マスク右側の2重丸を選択。
これでマスクを読み込んで使います。

以上がその他の細かな設定解説です。

まとめ

今回はModular AvatarでRadialを使ったギミックの作り方を紹介しました。

・MA Menu Itemのタイプを「Radial Puppet」にするとラジアルメニューが使える
・ラジアルは回して値を0~100%で入力できる処理
・MA Parametersを使い0~100%の入力を0.00~1.00に加工する
・MA Parametersで設定した情報をアニメーションコントローラーで引き出す
・あとはステートを操作しParameterと関連付けてギミックを作る
・アニメーション作成時はアニメーションコントローラーを刺す位置に注意

また他にもModula AvatarやVRChatについて解説してます。

【VRChat】MAでTowAxisを使ったギミックの作り方【Modular Avatar】
MA Menu Itemのタイプを「Tow Axis Puppet」にすると2Axisメニューが使えます。これはジョイステック操作で縦と横の値を取得する処理です。コントローラーのステートにBlendTreeを設定して複数アニメーションを操作。

ぜひ、こちらをご覧ください。

コメント

タイトルとURLをコピーしました