バーチャル思考実験室

基本的にTwitterに書き捨てたものを拾い上げて整理してます。

【VRChat】パーティクル(Particle System)とエモートスイッチで発生する問題の解決

最近「エモートスイッチとパーティクルが干渉する」的なツイートを目にすることがあったので、その解決手段と発生原理について記しておきます。

(Twitterで解決まで至った流れ↓)
twitter.com



※この記事はSimulation SpaceWorldになっているParticle SystemをFixed JointVRC_IK Followerを用いてアバターに導入する際に起こる問題点について書きます。
それぞれの導入法なんかは以下の御二方の記事を読んでください。

VRChatでParticleで魔法とか銃とか撃つ方法とそのSimulation Spaceの注意点|さささ|note

【VRChat】超お手軽っ!!IK Followerを使ったワールドパーティクル!! | ケーキのPC情報集会所

また、今回の記事でエモートスイッチとして想定しているものは元怒さんとがとーしょこらさんによるEmoteSwitch V3によって生成されたものとしています。
EmoteSwitch V3 - 元怒の扉 - BOOTH


ザックリ端折って気を付ける点のみを上げるとすれば
・エモートスイッチの下にVRC_IK Followerを入れるな。
・Fixed JointをON/OFFするな。

この二つです。


以下、それぞれの方式で何が起こるのかを記載していきます。

Fixed Joint方式について

Fixed Jointを使った方式についてよく起こる問題が「出すたびに位置がどんどんズレていく」というやつです。
これは「Fixed Joint Componentを付けたオブジェクト(及びその親オブジェクト)をON/OFFしている」ことが原因で。
発生の原理についてはFixed JointがONになっている間は対象のボーンと動きを同期させているが、OFFの状態ではONの時に動いた先の位置に固定され、改めてONになったときにその位置からまた動き出すためです。

これの解決策としては、Fixed Jointを付けるための階層を1つ用意し常にそれがActiveの状態を維持、その下の階層にあるものをアニメーションオーバーライドでON/OFFしたり、エモートスイッチの対象に入れるようにしてください。

VRC_IK Follower方式について。

VRC_IK Followerを使った方式で起こる問題が「エモートスイッチでONにした後OFFにならない」というやつです。(上記のモーメントまとめがそれです。)
これもFixed Jointの時と同じように「VRC_IK Follower Componentを付けたオブジェクト(及びその親オブジェクト)をON/OFFしている」ことが原因なのですが、かなり特殊な挙動なので解説を後述します。

これの解決策としては、Fixed Jointと同じようにVRC_IK Followerを常にONにしていればいいので「『目的のParticleSystemより上の階層』且つ『追従させたいBoneより下の階層』でOFFになっていないGameObjectにVRC_IK Followerを付ける」ことで問題なく動かすことができます。
理想としてはBoneとエモートスイッチ機構の間に適当なGameObjectを作成しそれにつけることですが、自動生成されたJointという名前のGameObjectにつけることでも実装可能です(妥協案)。

f:id:fleycham:20200229024121p:plain
それぞれのHierarchyの違い
f:id:fleycham:20200229163138p:plain
妥協案の構造

解説

このVRC_IK FollowerというComponentはVRCが提供しているComponentなので、公式のドキュメントしか情報がないわけですが。
(公式ドキュメント→)VRC_IKFollower
ここには使い方と浅い実装内容のみで挙動の具体的な内容がほぼ書かれていません。
なので、実験や人伝に得たVRC_IK Followerの情報について箇条書きでまとめます。
・VRC_IK FollowerのついたオブジェクトはPosition及びRotationの値が全て0になり、Scaleの値が1になる。
・VRC_IK Followerのついたオブジェクト(及びその子のオブジェクト)はVRC上ではAvaterのHierarchyの外に持ち出されている。
・VRC_IK FollowerをVRC内でアクティブにした場合、その瞬間にAvaterのHierarchyの外に持ち出される。
・VRC_IK Followerを付けたオブジェクト及びその子のオブジェクトに対するAnimationの挙動は保持されている(AnimationのPassを書き換えている?)
上記の点から実際に何が起こっているのか説明します。

説明

①エモートスイッチ(基本非表示)の下にVRC_IK Followerのついたオブジェクトを入れた状態でアバターをアップロードする。
②VRChat上でエモートを使用しVRC_IK Followerがアクティブになる。
③アクティブになったVRC_IK Followerによってそれ以下の階層がAvaterの外へ持ち出される。
④エモートで親オブジェクトをOFFにしてもすでにAvaterの外に出ているのでVRC_IK Follower以下のオブジェクトは非表示にならない。
これが原因でエモートスイッチによる不可逆的なオブジェクトの出現が起きています。

あとがき

ここら辺の情報(というか気を付ける点)が全然どこにも書かれてなかったので書きました。
仕組みの理解をしたうえで挙動の原因を書かないといけないのでまぁ手間ですが。

追記

エモートスイッチについてツールの使い方はあるものの、どういった仕組みで行われているのかの説明が全くどこにもなかったのが個人的に「マジか」と思ったので、気が向いたら解説記事でも書きます。