- 投稿日:2020-07-29T20:21:09+09:00
VRM Tool Kit 取扱説明書
VRM とそれにまつわる面倒事をどうにかしよう、という Unity 向けのツールです。
VRM がパッと作れるのはモチロンですが、更新のたびに何度もシーンを作り直さなくても良い、というのが最大の特徴です。
こんな方におススメ:
- 「モデル更新のたびにVRMを作り直すのはイヤ」
- 「モデル・ボーン調整→揺れ物チェックを行ったり来たりしたい」
- 「Spring Bone が面倒でつらい」
- 「モデル上がってきたし仮でいいから演者に合わせてみたいんよ、とりあえずVRMくれ。」
- 「昨日話題に上がったやつを今日の生放送までにモデルに反映させたいんだけど??」
VRMの作成や調整、更新を継続的、頻繁に行う場合に特に有用なツールです。
VRM Tool Kit の特徴
「VRM Tool Kit」には、大きく分けて2つの機能があります。
?「揺れ物セットアップ」VRM Spring Bone の一括作成・編集ツール
ボーンやコライダーなど多数のオブジェクトを一括で調整するためのツールです。
- 人型キャラクターに合わせたコライダーの作成
- 揺れ物ボーンの一括登録
- コライダーの一括編集
- 多数のボーンとコライダーの関連付け
♻️「非破壊ワークフロー」作り捨てではない Unity のシーン作り
メッシュやボーン・スキニングなど、何かを更新する度にシーンを作り直さなくても良いようにするためのツールです。
- 「モデルの追加や既存モデルの更新」「ブレンドシェイプの追加・更新」「スキンウェイトの更新」等が、VRMを書き出せる状態を維持したまま可能。
- モデルのブラッシュアップと VRM セットアップ作業を並行して進めることが可能。
- ボーンの追加・削除・更新・階層構造の変更が可能。
- 揺れ物(Spring Bone)のパラメーターだけではなく、モデルの割りやボーン数・位置の調整も含めてのトライ&エラーを行うことが可能。
マニュアル
ライセンス
個人ライセンスでのソフトウェアの利用は、団体・法人以外の個人的な用途に限り利用可能です。
ソフトウェアの解析や改変・再配布など許可のない利用は禁止されています。制作・著作
Copyright © Sator Imaging, all rights reserved.
VRM and UniVRM are licensed under the MIT License.ダウンロード
VRM Tool Kit のダウンロードはこちら。
動作確認
公式の VRM ビューアーや VRM 対応ソフトウェア(PC)で書き出した VRM の動作を確認しています。
VRoid Hub 等のアップロードして利用するタイプのサービスや、スマホアプリでの動作が上手くいった&上手くいかなかった等がありましたら、ココや Twitter(@sator_imaging)にてお知らせいただけますと!
更新履歴
- v1.0.0
- 推奨バージョン:「VRM v0.53.0」+「Unity 2018.4.0f1」
もくじ
インストール方法
まず最初に VRM 作成用の Unity プロジェクトに VRM(UniVRM)のパッケージをインポートします。
VRM(UniVRM)のダウンロードは以下のページより行います。※ バージョンは v0.53.0 を推奨しています。
--
続いて、ダウンロードした「VRM Tool Kit」に含まれている、
VRMToolKit-<バージョン>.unitypackageをプロジェクトにインポートします。--
最後に「VRM Tool Kit」に含まれている、非破壊ワークフローを実現する上で必要な VRM 用の更新ファイル(
UniVRM-<バージョン>_BlendShapePreviewEditor.unitypackage)をインストールします。
- 注: 更新ファイルをインストールしていなかったり、UniVRM v0.53.0 以外のバージョンを使用していてブレンドシェイプのプレビューが表示されない場合は、インスペクターの「Prefab」パラメーターに、
.fbxファイルを設定することで表示されるようになります。※ UniVRM の更新ファイルをインストールしていない場合の使い方
macOS での VRM プレビュー
macOS では VRM をプレビューするためのアプリが公式からは提供されていません。
macOS 上で確認する必要がある場合は、VRM ビューアーをインストールすることが出来ます。
Unity Package Manager を利用する場合
VRM 公式サイトから
UniVRM.asmdef-<バージョン>.unitypackageを追加でインストールすると、「VRM Tool Kit」を Unity Package Manager のパッケージとして読み込むことが出来るようになります。※ パッケージとして利用する場合は、赤線で示した UnivRM の
***.asmdefも合わせて導入します。
上記の追加ファイルをインストールした上で、「VRM Tool Kit」に含まれている
VRMToolKit.asmdef.txtというファイルをVRMToolKit.asmdefという名前に変更することで、パッケージとして読み込むことが出来るようになります。パッケージとして読み込む方法は以下のマニュアルをご覧ください。
VRM Tool Kit 使用方法
VRM シーンの作成手順
VRM シーン作成手順と注意するべき点は以下の通りです。
- Unity の Fbx ファイルの読み込み設定で「Rig」が「Humanoid」になっているかを確認します。
- 「Avatar Definition」の「Configure...」を開いて、Eye・Jaw に必要のないボーンがアサインされていないかを合わせて確認します。
- Fbx ファイルをシーンのヒエラルキーに追加します。
アバターが T ポーズになっていない場合は T ポーズにします。
- 注:揺れ物のボーンもモデリングに合わせたままの状態ではなく、重力に従うように調整します。
- セットアップ時のダイアログで「Auto T-Pose」選択するか、
VRM > Character > Character to T-Poseを実行することで自動で T ポーズにすることが出来ます。 ※これは VRM 書き出しオプションでForce T-Poseをオンにした時と同じ状態です。- 注:ただし、VRM の提供する
Force T-Poseを使って T ポーズにすると、腿と足は問題ないが膝のボーンだけがねじれている、など気付き辛いエラーが発生する場合があるので、おかしなところがないか必ず確認するようにします。
- 自動で T ポーズにした後に
VRM > Character > Except for Arm & Finger Rootを実行すると、肩から手首、指の根元のボーン以外をプレハブの初期値に戻すことができます。アバターを選択した状態で、
VRM > Export FBX-Linked VRMを実行します。
※ この段階で非破壊ワークフローのベースが出来ているので、一度Pose FreezeとForce T-Pose(必要な場合)をオンにして、VRM 書き出しを行って問題がないか確認しておきます。続いて VRM ブレンドシェイプのパラメーターを設定します。
スプリングボーンツールを使用して揺れ物のセットアップを行います。
VRM Metaにタイトルや作者の情報を設定します。注: ボーンのセットアップの状態によっては、自動 T ポーズ機能を使うと一部のボーンが曲がることがあるので必ず確認します。
※ 自動 T ポーズを調整せずにVRMを書き出して、がに股になった状態。
--
VRM の基本設定は以上で終了です。
メニューの
VRM > Check Listの項目を確認してから、.vrmとしてエクスポートします。注:VRM を書き出すときは、
Pose FreezeとForce T-Pose(必要な場合)をオンにします。揺れ物のセットアップ手順
揺れ物(
VRM Spring Bone)ツールの使い方は以下の動画で確認できます。
※ 各機能の詳細は次のリファレンスの項目をご覧ください。【YouTube】VRM Tool Kit - 揺れ物セットアップツール
スプリングボーンについての確認事項
揺れ物のボーンをどれだけ細かくしているかによりますが、殆どのキャラの場合コリジョンの分割数はデフォルトの 0.05(5cm 毎にコライダーを作成)で十分です。
- PC ではなくモバイル向けなら 5cm だと少し処理が重いかもしれません。適宜調整します。
- 動画を見てわかる通り、そもそもコリジョンをいくら細かくしても揺れ物のボーンが粗いと貫通します。
- 重要なのはコライダーと揺れ物のバランスです。
VRM Spring Bone のコライダーは正確な衝突判定をしているわけではなく、「中心点から半径以内の距離に位置していたら衝突しているということなので押し出す」という処理を行っているだけなので、神経質にこだわってもあまり結果に結びつかないことが多いです。
揺れ物のボーンの数とコライダーの数がバランスを保っていることの方が重要なので、一度セットアップして動かしてみてから、必要に応じて揺れ物の衝突判定箇所を増やす等を行います。
- なので、工程の後戻りができることが重要になります。
衝突判定する場所を増やすだけであれば、スキニングの為のボーンを追加する必要はなく、ボーンとボーンの間にロケーターやヌル(=GameObject)を挟むだけでも問題ありません。
- スキニング用のボーンが仕込んであるよりも精度は低いですが、腕を貫通していたものがめり込みはするが貫通はしなくはなった、程度には出来ると思います。
PC VR 向けなど処理の負荷を考えないのであれば、コライダーもボーンも細かく入れてしまうのが早いです。
それでも難しければ、そもそもあまり揺れないようにバネを強くして、水の中にいるような状態にしてめり込みや貫通が起きづらい状態にして逃げます。
注: 処理負荷の関係でコライダーの数は減らしたとしても、足や手など揺れ物から離れている部分のコライダーの削除はなるべく避けたほうが良いです。
髪の毛が揺れて腕に衝突しているのを見ると、多くのユーザーや演者は手でも髪の毛を触れると思って触ろうとして、あれ突き抜けた? となることが多いです。
リファレンス
VRM Tool Kit をインストールすると、Unity エディターの VRM メニューに項目が追加されます。
各機能の詳細は以下の通りです。
※ 各機能は特に指定が無いかぎり、VRM アバターのルートを選択した状態で実行します。Export FBX-Linked VRM
Fbx キャラクターを VRM として出力できるように調整した上で、VRM のエクスポートダイアログを表示します。
※ 実行時にダイアログウインドウが表示されるので、処理内容を選択します。
- Auto T-Pose: 自動で T ポーズにします。
- Current Pose as T-Pose: 現在のポーズを T ポーズとして扱います。
※ 初期化時は「Auto T-Pose」、更新時は「Current Pose as T-Pose」を使うのがおススメです。
Character
キャラクターに関する機能です。
Character to T-Pose
- キャラクターを T-Pose にします。
Revert to Default Pose
- キャラクターを初期ポーズに戻します。
Except for Arm & Finger Root
- 「肩」「上腕」「前腕」「手首」「指の根元」を除いたすべてのボーンを初期ポーズに戻します。
Revert All Transforms to Default
- キャラクターのボーンだけではなく、揺れ物を含む全ての Transform を初期状態に戻します。
Spring Bone
「VRM Tool Kit」の揺れ物(
VRM Spring Bone)に関する機能です。※ UniVRM に含まれる
VRM Spring Boneについての詳細は以下のページで確認できます。
https://vrm.dev/univrm/components/univrm_secondary/
Spring Works
Add Spring Manager
- スプリングマネージャー(
VRM Spring Bone)をアバターに追加します。 ※「髪」「スカート」等、各部位ごとにマネージャーを作成するようにします。Add Spring Collider to Selection
- 選択したオブジェクトにコライダー(
VRM Spring Bone Collider Group)を追加します。Select Colliders in Hierarchy
- 選択しているオブジェクトとその階層の中から、コライダーがアタッチされている GameObject を選択します。
Assign Bones & Colliders to Spring Manager
Scale Up/Down Selected Colliders' Radii
- 選択している全ての Spring Bone コライダーの半径を拡大・縮小します。
Generate Human Colliders for Selected Animator
- 選択したヒューマノイドキャラクターのボーンに対してコライダー(
VRM Spring Bone Collider Group)を追加します。 ※ コライダーがアタッチされたCollider__<BoneName>と言う名前の GameObject が各ボーンの子供として追加されます。Remove Null References from Hierarchy
- 選択しているオブジェクトとその階層のコンポーネントから、missing になっている Root Bone や Collider を取り除きます。
Check List
エクスポート前に確認するべき項目の一覧です。
※ 各メニューは一覧表示の為だけの物で、選択しても機能しません。
VRM(UniVRM)について
VRM と UniVRM についての詳細は、以下のページで確認できます。
--
以上です。お疲れ様でした。
あわせてどうぞ
各種ライセンス情報
この記事内で使用、改変しているデータのライセンス情報は以下の通りです。
アリシア・ソリッド
ユニティちゃん
この記事中で使用されているユニティちゃんは、ユニティちゃんライセンス条項の元に提供されています。
- 投稿日:2020-07-29T15:28:07+09:00
Unity 3D入門 #8 [ライトの実装&一人称視点 ]
ホラーゲームによくあるライトの実装をします。
まずは懐中電灯の実装ということで、下のURLを参考に行なっていきます。
参考URL:https://gametukurikata.com/light/flashlight
Unityに初めからついているDirection Lightがついているとライトの機能の確認が難しいので、チェックを外して世界を暗闇にします。
また、そのままだと、懐中電灯によるSpot Lightのみが光源となってしまうため、下のURLにあるPoint Lightをプレイヤーの場所に設置します。
ライトの種類参考URL:https://creator.cluster.mu/2020/04/15/unity-light/ホラーゲームっぽくなってきました。
次に、カメラを今の3人称視点から一人称視点に変更します。
参考URL:https://codegenius.org/open/courses/24/sections/117
とりあえず一人称視点とすることができました。あとはMain Cameraを基準としたプレイヤーの動きの変更とカメラアングルの変更コードを書いていきます。
Vector3 tmp = player.transform.position; // Playerの位置情報を取得 Vector3 cam = new Vector3(tmp.x, tmp.y + 1.2f, tmp.z); this.transform.position = cam;ここで、参考URLではプレイヤーとカメラに親子関係を持たせていますが、このゲームでの実装ではカメラとプレイヤーを別々のオブジェクトとして、カメラは単純にプレイヤーの位置を追従するようにします。
Vector3 angle = this.transform.eulerAngles; // 現在のカメラアングル if (Input.GetKey(KeyCode.D)) { angle.x += Time.deltaTime * _positionStep; } if (Input.GetKey(KeyCode.A)) { angle.x -= Time.deltaTime * _positionStep; } if (Input.GetKey(KeyCode.E)) { angle.y += Time.deltaTime * _positionStep; } if (Input.GetKey(KeyCode.Q)) { angle.y -= Time.deltaTime * _positionStep; } this.transform.eulerAngles = angle; // カメラアングルの変更カメラアングルの変更はDAEQで行うようにしました。
また、一人称にするとプレイヤーがチラチラカメラに写ってしまい目障りなので、プレイヤーオブジェクトはカメラに映らないようにします。
参考URL:https://teratail.com/questions/155158原因不明ですが、SubCameraを使用すると十字キーでプレイヤーを移動した時に床をすり抜けるバグが発生したので、Main Cameraを一人称視点にしました。
また、Main CameraにSpot Lightを親子関係にしたらうまく動作しなかったので、Spot Lightは個別のオブジェクトとしてプレイヤーの位置とカメラの角度を追うようにしました。
private GameObject cameraObject; private GameObject player; void Start() { cameraObject = GameObject.Find("Main Camera"); player = GameObject.FindWithTag("Player"); } void Update() { Vector3 tmp = player.transform.position; Vector3 light = new Vector3(tmp.x, tmp.y + 1.2f, tmp.z); this.transform.position = light; this.transform.forward = cameraObject.transform.forward; }これで、できたものが以下となります。
割と不具合が多く大変でした。
- 投稿日:2020-07-29T09:40:14+09:00
DOTween完全に理解するその6 イベント編
前回:DOTween完全に理解するその5 Sequence編
今回解説するもの
今回はDOTweenのイベントについて解説していきたいと思います。
イベントはTweenに特定のタイミングで処理を挟むのに有効ですが、
設定や状況によっては想定と違う動作を起こすので注意が必要です。開発環境
Unity:2019.4.0f1
DOTween:v1.2.335イベント登録API
API 概要 OnStart 動作開始時に1度だけ呼ばれる OnPlay 動作開始時に毎回呼ばれる OnUpdate 動作中毎フレーム呼ばれる OnPause 動作停止時に毎回呼ばれる OnComplete 正方向の動作完了時に呼ばれる OnStepComplete 動作完了時に呼ばれる
各ループの完了時にも呼ばれるOnRewind 初期位置に戻った時に呼ばれる(PlayBackwardsなどで逆再生した場合も含む) OnWaypointChange DOPathで各Pathに到達した時に呼ばれる
Pathのインデックスが引数でOnKill Tweenが破棄される時に呼ばれる(Tweenがリサイクルされる場合も呼ばれる) 各イベントの特徴
OnStart
動作開始時に1度だけ呼ばれます。
それ以降はRestart()やRewind()を使用しても呼ばれることはありません。
また、TweenにDelayがかかっていた場合Delayが終わった後に呼ばれます。
(個人的にはこれが少し使いづらいかなと思う時もあります...)
Play()などを行わずにComplete()で終端まで実行した後PlayBackwards()などで逆再生した場合にも呼ばれます。
Sequenceの場合は先頭にAppendInterval()やPrependInterval()をした場合でも
動作開始時にOnStartが呼ばれます(OnPlayも同様)OnPlay
停止状態から動作開始した時に毎回呼ばれます。
OnStartと同様にDelayの影響を受けます。
PlayForward()、PlayBackwords()、SmoothRewind()など
停止中に動作を開始するAPIが呼ばれた場合にイベントが呼ばれますが、
動作中にこれらのAPIで再生方向が変わったとしてもOnPlayは呼ばれません。
また、すでにOnPlayが呼ばれた状態でGoto(andPlay:true)を呼んだ場合もOnPlayは呼ばれません。OnUpdate
動作中に呼ばれます。
ただあまり使うシチュエーションは無い印象です。
OnStartと同様に通常のTweenの場合はDelayの影響を受け、
Sequenceの場合はDelay(Interval)の影響を受けません。OnPause
動作停止時に呼ばれます。
AutoKill=falseの場合は動作完了時にも呼ばれる為、
OnCompleteやOnStepCompleteとタイミングがシビアになります(後述)
AutoKill=trueの場合は動作完了時にOnKillが呼ばれOnPauseは呼ばれません。OnComplete
動作完了時に呼ばれます。
ただ、通常再生の場合にのみ呼ばれPlayBackwards()などで逆再生の場合は
動作完了時であっても呼ばれません。
また、Complete()実行時にも呼ばれます。OnStepComplete
動作完了時に呼ばれ、通常再生、逆再生に関わらず呼ばれます。
SetLoop()で設定したループの一動作が終わる度に呼ばれます。
Complete()、Rewind()、Goto()などで動作が終了した場合は呼ばれません。OnRewind
Tweenが初期位置に戻った時に呼ばれます。
初期位置というのは経過時間が0秒の位置のことを指します。
PlayBackwards()やSmoothRewind()でアニメーションが終わった場合に呼ばれますが
LoopType.Restartでアニメーションがループされる場合は呼ばれません。
また、Rewind()実行時にも呼ばれます。OnWaypointChange
DOPath限定のイベントです。
DOPath生成時に設定したPathに到達した時に呼ばれます。
引数にPathのインデックスが渡されてきます。
SetOption()でClosePath=trueだった場合などでIndexが変わります(後述)OnKill
Tweenが破棄される時に呼ばれます。
破棄される時と言ってもTweenがRecycable=trueでも呼ばれます。
再生されていない状態でComplete()を実行した場合にも呼ばれます。
AutoKill=falseの場合は動作完了時にOnPauseが呼ばれOnKillは呼ばれません。注意すべきイベントの挙動
動作完了時に呼ばれるイベント群とその優先順位
通常の再生の場合は
OnStepCoplete > OnComplete > OnKill/OnPauseの順で呼ばれます
逆再生の場合はOnRewind > OnStepComplete > OnCompleteの順で呼ばれます。
よくあるパターンとしてスライドインしてくるUIを作った場合は
OnCompleteに通常再生の終了処理を書いて、OnRewindに逆再生の終了処理を書くのが良いかなと思います。Sequence内のTweenのイベント
以下はイベントを設定したTweenに直接
SetLoop()でLoopType.Yoyoを設定しています。
各Loop終了時にOnStepCompleteが呼ばれていることが確認できます。
以下は同じイベントを設定したTweenをSequenceにAppendし、Sequenceに
SetLoop()を行なっています。
各Loop終了時にOnCompleteやOnRewindが発生するようになっています。
このようにSequence内にあるTweenのイベントは個別に状況に合わせたイベントが呼ばれます。OnWaypointChangeのindex
OnWaypointChangeの引数として来るindexはDOPathの設定によって変わります。
一般的な場合(ClosePath=false、ループなし)
index 場所 0 初期位置 1 Path[0] 2 Path[1](終了位置) ClosePath=trueの場合
ClosePath=trueの場合、終了位置が初期位置になりますがその場合は
Indexが0ではなくPath総数+1になります。
index 場所 0 初期位置 1 Path[0] 2 Path[1] 3 終了位置(初期位置) ClosePath=trueでLoopする場合
ClosePath=trueで
SetLoopを設定した場合は複雑になります
LoopType.Restartの場合はLoopなしの時と同じように
Restartした初期位置はIndex=0で終了位置はPath数+1になります。
LoopType.Yoyoの場合は
逆再生する直前のIndexはPath数+1となり、逆再生中は各PathのOnWayPointChangeは2回ずつ呼ばれる
という挙動になります。
この2回ずつ呼ばれるという挙動が結構曲者で、ドキュメントにも特に何も書いてないので
もしかしてバグなんじゃ...なんて思います。
同じIndexのコールバックは無視するような対応を行い、OnStepComplete時に無視フラグをリセットするような実装が必要になるかと思います。まとめ
イベントはエフェクトを表示したり、入力の受付状態の切り替えなど
DOTweenとは別の仕組みと連携するために使用されることが多いと思います。
特にOnStepCompleteやOnPause、OnRewindなどは使うシチュエーションはよく使うことになるので
DOTweenを応用して使う場合は身につけておくべき要素ですね。余談ですがこの記事を書いていた7/29に
DOTweenの新バージョン(1.2.420)がAssetStoreで公開されたようです。
async/await対応
Sequence向けのSetDelayの拡張
ゲームでよく使いそうなカウントを使用するDOCounter
1文字ずつにアニメーションを行えるDOTweenTMPAnimator
などの良さそうな変更がかかっているようです。
特にDOTweenTMPAnimatorがかなり強力そうなのでこれを機にPRO版を購入しようと思います。Sent #DOTween + Pro update to the Asset Store, with lots of new stuff (and some bugfixes) like TextMesh Pro per-character animation/transforms (Pro only): https://t.co/sI2qJVllFC
— ?Daniele Giardini (@demigiant) July 24, 2020
(no DOTween Timeline yet but that's the next step for real :P) pic.twitter.com/fyDdq5MSGo
- 投稿日:2020-07-29T05:46:26+09:00
OculusRiftとFinal IKでVTuberになる
はじめに
OculusのHMD「Oculus Rift S」とUnityの有料アセット「Final IK」で MMDモデルになりきってアバターを動かす方法と,そのときのポイントや落とし穴について書きました.
Oculus社のHMDなら旧型のRiftやOculus Linkで接続したOculus Questでもまったく同じように動かせると思います.準備したもの
- Oculus Rift S
- Unity (v2019.2.17f1)
- MMDモデル Kizuna AI
- MMD4Mecanim (20200105 Beta)
- Oculus Integration
- Final IK
とりあえずHMDでMMDを動かしてみる
1. Unityで3Dプロジェクトを作成
2. PMX形式のMMDをUnityにインポート
好きなMMDを用意してください.個人利用であればニコニ立体やBOOTH,企業VTuberの公式サイトなど様々なところで色々配布されているものを使えると思います.この記事では例として「キズナアイのMMD」を利用させていただこうと思います.
Kizuna AI ver1.01 © Kizuna AI
配布されている3Dモデルデータは一般に
.pmxという形式が多いですが,Unityで読み込むことができるのはFBXという形式なのでPMXをFBXに変換する必要があります.MMDを変換するためにNoraさんが公開しているMMD4Mecanimを使用します.MMD4Mecanimをダウンロードしてzipファイルを解凍し,「MMD4Mecanim.unitypackage」をドラッグアンドドロップでUnityにインポートしてください.
次にUnityのProjectウィンドウから
PMX形式のMMDをまるごとドラッグアンドドロップでAssetsに追加します.MMD4MecanimによってPMXファイルがあるのと同じ階層に自動で.MMD4Mecanim.assetというファイルが生成されると思います.
この
.MMD4Mecanim.assetをクリックしてInspectorウィンドウからProcessボタンをクリックすると変換が行われます.(その前にMMDの利用規約に同意する必要がある場合があります.)フォルダの同じ階層にFBXファイルができていればUnityへのMMDのインポートは完了です.
このPrefabをHierarchyウィンドウにドラックアンドドロップすることでシーンにモデルを配置しておきます.
最後にインポートしたモデルをFinal IKで制御するためにAssets下にあるMMDのPrefabを選択してInspectorウィンドウの Rig > Animation Type を
Humanoidに変更してApplyを押します.
2.5. [余談] 自作MMDを使う
この投稿ではモデルの自作については触れませんが,モデルを自作する方法としてはBlenderなどの無料モデリングソフトでフルスクラッチで作るという高い技術を求められるやり方以外にも,最近はVroid Studioなどの比較的簡単に作れるツールが充実してきていると思います.
ちなみに,Blenderで自作した場合にはFBX形式で出力できるため上述のMMD4Mecanimによる変換は必要ありません.また,Vroid Studioは.vrmで保存することになるため,UniVRMを利用してUnityにインポートする必要があります.3. Oculus Integrationの導入
UnityでOculusのHMDを使用するためにOculusからUnity Asset Storeで公開されているOculus Integrationを導入します.
今回はUnity 2019内のAsset StoreからOculus IntegrationをImportします(Unity 2020ではインポートの方法が若干変わっています).
次にインポートしたOculus Integrationの中から Assets > Oculus > VR > Prefabs にある
OVRCameraRigをSceneに配置します.これがHMD用のカメラになります.HMD用のカメラを配置したので元々あったMain Cameraは削除して問題ありません.
4. Final IKの導入と設定
Oculus Integrationのときと同様にAsset StoreからFinal IKをダウンロードしてインポートします.
Assets > Plugins > RootMotion > FinalIK > IK Components > VRIK.cs をSceneに配置したキズナアイのPrefabにアタッチします.
Sceneの OVRCameraRig > Tracking Space の中にあるCenterEyeAnchor,LeftHandAnchor,RightHandAnchorそれぞれの中にEmpty Objectを作成します.トラッキングスペースの中に配置したこのオブジェクトをVRIKでモデルにトラッキングさせることでモデルを動かします.空オブジェクトの名前はHeadTarget,LeftHandTarget,RIghtHandTargetとしました.
作成したターゲットの空オブジェクトをモデルにアタッチしたFinal IKのスクリプトにアタッチします.
ここまででHMDの頭と両手に追従してMMDを動かすことができます.
いろいろ設定していく
視点を合わせる
HMDを装着した人とアバターの顔の視点を合わせます.
OVRCameraRigのInspectorから OVRManager > Tracking > Tracking Origin Type をEye LevelからFloor Levelに変更します.
HMDはアプリケーション実行時に本体の高さを取得します.その後,Eye LevelではHMDの位置を原点(高さ0)としてSceneを配置します.これは空からVR空間を見下ろす場合など使用者の身長にかかわらず同じ高さにカメラを置きたいときなどにカメラのオフセットを高くするなどしてよく使用します.一方でFloor Levelでは足元を原点(高さ0)にSceneを配置します.これは本記事のようにMMDになりたい場合など使用者が地面に接地している場合によく使用します.
身長を合わせる
自分の身長とMMDの身長(腕の長さや腰の高さなど)が大体同じくらいになるようにMMDのInpsectorからScaleを変更します.この辺りは実際にHMDを装着してGame Viewで見ながら合わせるとやりやすいと思います.
レンダリング範囲の設定
現在の状態で実行するとMMDの顔の内側まで表示されてしまい,場合によっては結構グロテスクな映像になってしまいます.そこで OVRCameraRig > TrackingSpace > CenterEyeAnchor のInspectorから Camera > Clipping Planes のNearを0.15程度に設定します(MMDによって適当な値に変更してください).これでカメラから0.15以内のオブジェクトは表示されなくなり,MMDの顔を内側から覗くことはなくなります.
パラメータ調整
手の角度を調整します.キズナアイのMMDはこのままだと手の角度がおかしいので,左手のターゲットのRotation-Yを90度,右手のターゲットのRotation-Yを-90度に変更します.
以上で,Unityからプロジェクトを実行するとHMDでキズナアイを動かせるようになりました.
おまけ
自分の姿を見る
自分の姿を客観的に観測したい場合は,OVRCameraRigの中のCenterEyeAnchorがHMDの視点なので,これを現在のHMDの頭と重なった状態から角度を180度回して少し前に出せば良いです.
指の制御
OculusFingerというMMDの指にアタッチするだけでコントローラのボタン入力で指を動かせるスクリプトが開発されています.詳細は省きますが,解説付きなので読みながら回転角を調整してあげれば指も動かせるようになりました.
おわりに
Final IKを用いると簡単にMMDの制御ができました.
いろいろなサイトを参考にさせていただいた結果,投稿内容の前半は何番煎じか分からないようなものになってしまいそうになりましたがここからフルトラじゃなくてももっと自然な動きを追求していきたいところです.参考にさせていただきました









































