2024-04-07 OSC トラッカーを使った移動アニメーション(振り返り)
This page is available in English: English
このページは AI(Claude)によって翻訳されています。翻訳に誤りが含まれる可能性があります。
VRChat には OSC トラッカーという機能があります。これは、カスタムの SteamVR ドライバーを作らなくても、ソフトウェアで制御するトラッカーを追加できる低コストな方法として存在し、Quest 単体のヘッドセットでも使えます。
実験として、移動の「アニメーション」にこの OSC トラッカーを使ってみたいと思っていました。移動アニメーションのロジックを、Animator Controller とアニメーションクリップではなく、外部のプログラムから与えるのです。
不思議なことに、書き留めたのはつい最近ですが、これをやりたいとはもう 1 年以上前から思っていたと確信しています。
フラットスクリーンの三人称視点ゲーム
三人称視点のゲームを遊んだことがあれば、これから話す内容はおわかりでしょう。グランド・セフト・オート、アサシン クリード、アンチャーテッド、メタルギアソリッドなど、どれも三人称視点で主人公を操作します。一人称視点の場合でも、動き回る NPC がいます。ゲームキャラクターの動きを良く見せることに特化した産業が、丸ごと存在しているのです。
アイデアは、外部のプログラムで、三人称視点ゲーム用のキャラクターコントローラーを作る(または再利用する)ことです。そのキャラクターに OSC トラッカーを持たせ、私の生身の体の代わりに、この仮想キャラクターが VRChat のアバターを操るようにします。
このテーマについては、興味深い講演がいくつもあります。私のお気に入りの講演とデモをいくつか紹介します。
https://www.youtube.com/watch?v=KSTn3ePDt50
- Kristjan Zadziuk (Ubisoft) - GDC 2016 - Motion Matching, The Future of Games Animation
https://www.youtube.com/watch?v=7S-_vuoKgR4
- Michal Mach (Naughty Dog) - GDC 2017 - Physics Animation in Uncharted 4: A Thief's End
https://www.youtube.com/watch?v=RCu-NzH4zrs
- Joe van den Heuvel (Valve) - SIGGRAPH 2021 - Character Locomotion in Half-Life: Alyx
https://www.youtube.com/watch?v=16CHDQK4W5k
- Ubisoft La Forge - SIGGRAPH 2020 - Learned Motion Matching
一般に、VR 以外の既存分野には確立された技術がたくさんありますが、それらが VR でどう通用するのかは本当に気になるところで、私はまだほんの表面をなぞっているにすぎません。
このプロジェクトは、ソーシャル VR の文脈で、ゲームアニメーションのどの技術を再利用できるかを探り始めるための手段でもあります。
VR には独自の制約があり、何が許容できるかには限界があります。その制約を見つける良い方法は、意図的に、あるいは偶然に、それを破ってみることだと思います。
JLPM22 による Unity 向けモーションマッチング
GDC 2016 で、Ubisoft の Kristjan Zadziuk 氏が、彼らが考案した手法「モーションマッチング」(上の最初の動画を参照)を発表しました。
この手法はゲーム業界に波紋を広げました。移動サイクル用のアニメーションの断片を使う代わりに、特別に収録してラベル付けした連続的なモーションキャプチャのセッションから直接サンプリングして、キャラクターの移動を直接駆動できるようになったからです。
実際、キャラクターは方向転換や停止の際に適切に体重移動で補正するので、ワールド内での非常に洗練されたキャラクターの動きが実現します。
JLPM22(Jose Luis Ponton)というハンドルネームのユーザーが、この手法のオープンなバージョンを Unity で実装して公開しています。
https://github.com/JLPM22/MotionMatching
これは実験を始めるのに良い出発点になりそうです。
プロジェクトをインポートし、手持ちのソーシャル VR 用アバターで動くようにいくつか修正を加えました(A、B)。
アイドルポーズが少し変でした(キャラクターが前かがみになっています)が、おおむねうまく動いていることに気づきました。
それ以外は、キャラクターは期待どおりにアニメーションし、平らな面の上しか動きませんが、テストにはそれで十分でしょう。
後で問題になりそうな点がすぐにいくつか予想できますが、試すのをやめるほどではありません。
- キャラクターが止まるのにも動き出すのにも時間がかかる。
- 移動中に頭が上下に揺れる。
- キャラクターが向きを変えるのに時間がかかる。
- キャラクターがストレイフ(横移動)できない。
私にはモーションキャプチャスタジオがなく、部屋も狭すぎて、長い距離をまっすぐ歩く本格的な自作モーションキャプチャはできません。そのため、既存のモーショントラッキングデータを自分のデータで補うことはできず、その制約の範囲内で動くようにするだけです。
OSC トラッカー
次に、そのキャラクターに OSC トラッカーを追加します。
過去の Double Hip Tracker のようなプロジェクトで、OSC トラッカーのデータを VRChat に送るための小さなライブラリをすでに書いていたので、これは簡単に済みました。
少し気をつけるべきなのは、OSC トラッカーのデータが相対的であることです。外部プログラムの中ではキャラクターがワールド空間を移動しますが、私自身は物理的な空間を移動しません。そのため、OSC トラッカーのデータは頭を基準にした相対値で送る必要があります。
これを解決する方法はいくつかあり、そのひとつは頭のデータを VRChat に送ることだったかもしれません。しかし私は代わりに、OSC トラッカーの位置を、キャラクターの頭の X 位置と Z 位置を基準にした相対位置として再計算し、それを HMD の X 位置と Z 位置にずらすことにしました。Y 位置(高さ)は無視します。キャラクターの頭は上下に動きますが、私の物理的な頭は同じ高さのままだからです。キャラクターが上下に揺れるのに合わせて、足が地面にめり込んでほしくありません。
Unity シーン内で、プレイスペースに対する HMD の位置が必要です。その情報を得る方法も何通りかありますが、過去のプロジェクトで Unity を使った SteamVR のオーバーレイ(およびバックグラウンドアプリ)をすでに作っており、HMD の位置を取得する方法も含まれています。オーバーレイなので、VRChat が VR で動作している間も実行し続けられます。
外部プログラム内でキャラクターを動かすために、このイテレーションでは次のようにしました。
- 動き回るのには、引き続きサムスティックを使っている。
- アバターパラメーターの Velocity を OSC 経由で取得し、その情報をキャラクターコントローラーに送ることにした。
- 次のイテレーションでは、後述するトラックパッドを使うように切り替えました。
- キャラクターの向きは、HMD の回転(HMD の前方向)で制御する。
- いくつか欠点があります(たとえば真下を向くと体が反転しますが、これは、ワールドの下方向との内積を使い、そのうえで HMD の上方向にフォールバックすれば簡単に解決できます)が、テストには十分です。
結果は次のとおりです。
先ほど挙げた問題のいくつかが、はっきりと見えています。
VRChat 側のキャラクターの速度が、外部プログラム内のキャラクターの動きと一致していません。その理由は次のとおりです。
- 外部プログラム内のキャラクターは現実により即して接地しているため、動きの反応が鈍い(これはモーションキャプチャのパフォーマンスの要件に左右されるかもしれません)。
- ワールド内の速度は、普通の人間のキャラクターにしては速すぎ、常に全力疾走しているようなものである(しかも、ワールドごとに異なります)。
その結果、ゲーム内の移動が非常にキビキビしているため、足が地面の上で目に見えて滑ってしまいます。
移動の快適さ?
VRChat は、快適さのために、加速のないキャラクターコントローラーを採用しており、それは理にかなっています。すべての動きは、サムスティックに直接対応した直線的な動きで、スムージングは一切ありません。
あらゆる年齢層を対象にしたゲームでは、ユーザーの快適さを保つことが重要になりがちです。ただ、近年では、ほぼ生まれたときから VR に慣れていて極端な移動方式にも耐えられる、新しい世代の若いユーザー層を特に狙い始めている VR 開発者もいます。
私には、今でも耐えられない VR 体験があります。特に次のようなものです。
- 目に見えるケージなしで、加速しながらキャラクターを横方向に回転させるゲーム。
- 床と天井の区別がつかない、地面に立つタイプの体験(たとえば、床と天井の両方が動画プレイヤーになっている、一部のソーシャル VR の音楽ヴェニューなど)。
それでもこれを試してみたいと思い、2 つ目のイテレーションに進みました。
外部プログラム内のキャラクターがサムスティックになる
このイテレーションでは、もうサムスティックを使ってゲーム内を移動しません。代わりに、外部プログラム内のキャラクターがサムスティックになります。
コントローラーのトラックパッドを使って、外部プログラム内のキャラクターに動き回るよう指示します。VRChat 内の Velocity はもう使いません。
外部プログラム内のキャラクターが実際にワールド内を動き回ると、その動きが OSC 入力(/input/Vertical と /input/Horizontal)で VRChat に送られます。
トラックパッドの値は OpenVR の API を使って読み取っています。サムスティックは、VRChat のサムスティックによる移動と競合してしまうため使えません。OSC 入力は、小さな値を送っているときにコントローラーの入力を乗っ取ってくれないようなのです。
サムスティックの動きは HMD の向きを基準にした相対的なものなので、外部プログラム内のキャラクターの動きも、HMD の向きを基準にした相対的なものに変換する必要があります。
結果は次のとおりです。
この結果ははるかに良く、特に急停止のときなど、足の動きがある程度接地して見えます。ただし、気づく点がいくつかあります。
- 足はまだ滑りますが、以前ほどではありません。これは、VRChat のアバターの動きと、外部プログラム内のキャラクターの動きが一致していないことを示しています。
- HMD を素早く回転させても、キャラクターの上半身が素早く回転することにはなりません。頭の向きを強調するには、モーションキャプチャデータとのより良い統合が必要かもしれません。
- 頭は HMD の位置で駆動されているため、上下に揺れることができません。
- 静止した VR の腕が、キャラクターの動きと対照的で、非常にぎこちなく見えます。
- 外部プログラム内のキャラクターの動きは、高低差の変化に対応できません。また、モーションキャプチャデータにもおそらくその情報はありません。
これが外から見た様子です。
内側から見ると、キャラクターの移動はもはや線形ではありませんが、滑らかな加速があるわけでもなく、その中間のようなものです。
また、トラックパッドの入力とゲーム内の動きの間には断絶があります。入力と、実際に VR の視界が動くことの間に遅延が生じるからです。これは本当に不安定な感覚ですが、不思議なことに、それによる VR 酔いはあまり感じません。
その他の考察
ほかにもいくつか問題が残っています。物理的にプレイスペース内を動いても足は動きませんが、キャラクターに動くよう指示すると、必要がなかったのにワールド内で移動する入力を VRChat に送ってしまいます。この誤ったフィードバックはおそらく解決できますが、このプルーフ・オブ・コンセプトで自分に課した目標はすでに達成できています。
それ以外は楽しそうに見えますが、フルボディトラッキングに対応させるのはあまりにも手間がかかるため、おそらくこのプルーフ・オブ・コンセプトに再び手を付けることはないでしょう。
私の結論:このプロジェクトの新しいイテレーションを作るなら、一人称視点のキャラクターと三人称視点のキャラクターで異なるアニメーションを使い、移動中にネットワーク同期されるキャラクターのアニメーションが他の人から見て良く見えるようにしつつ、一人称視点のキャラクターは引き続き快適に動き回れる、そんなソーシャル VR アプリを作れないかを調べてみたいと思います。
- VR では、一人称視点の移動は、入力に対して直接的で線形なままにします。
- 鏡に映る一人称視点のキャラクターの移動は、一人称視点の体験と一貫した、反応の良いものにすべきです。
- 一方、一人称視点ではないローカルカメラに映るキャラクターの移動は、キャラクターがサムスティックで移動しているときには、三人称視点の移動アニメーションシステムで駆動してもよいでしょう。そうすれば、録画した映像で見栄えが良くなります。
- 他のユーザーから見たローカルキャラクター(=ネットワーク同期されたもの)も、そのローカルキャラクターがサムスティックで移動しているときには、三人称視点の移動アニメーションシステムで駆動してもよいでしょう。
- これは、ワールド内でのキャラクターの位置がゲームプレイにとって重要な、対戦要素のあるソーシャル VR ゲームの文脈には当てはまりません。
目標は、一人称視点での違和感を生むことなく、ワールド内でのキャラクターの移動を面白く見せることです。
ソーシャル VR に特化した新しいモーションキャプチャデータ(動きがもっとキビキビしていて、上半身の動きを強調したものなど)を収録してみたり、より洗練された統合を試したりして、改善につながるかを確かめてみるのも良さそうです。
