見出し画像

VRChat備忘録③ Parent Constraintのススメ番外編(頭につける場合)

こんにちは、こむぎ* と申します。
VRChatの片隅を漂う無言勢の様な何かです。

前回、Parent Constraintの記事を書かせていただきましたが、大事な事を書き忘れていました。

トップ画像に帽子を手に持っている画像を貼り、「これもParent Constraintです!」と書きました。

それは嘘ではないんですが、実は前回の記事の手順を参考にしても、帽子・眼鏡などの頭につける物でParent Constraintを使おうとすると不具合が出てしまうのです…


Parent Constraint を使用して Head 配下につけた際の不具合

スクリーンショット (205)

こちら、前回の記事の手順を参考に、Parent Constraint で帽子を 頭・左手・腰につけた剣の柄、の3か所に移動させられるように作った物になります。

Sourcesの一個目の Hat Head Point は、頭にかぶった状態に位置を合わせた上、目印用のオブジェクトをアバターの Head の配下に入れました。

前回記事で、用意した目印は各ボーンの下に入れろって書きましたからね。当然今回は頭につけるんだからHead配下に入れましたよ。

そして、Parent Constraint設定後に、Head用のSourcesを1にした画像が上記の物になります。
ちゃんと頭についてますね。問題なさそうに見えます。

じゃあ、ゲーム内で動作チェックしてみましょう。



画像2

おわかりだろうか…

黒くて分かりにくいですが、首にめり込んでますね…

というわけで、Parent Constraint のドッキング先をHead配下に入れると、VRChatの仕様の問題で、首のあたりにめり込んでしまいます。

今回はこちらの解決策と、何故そうなるのかを書いてみたいと思います。


Parent Constraint でHead配下につけると位置がずれる原因

これは、VRChatのアバター表示の仕組みによる影響です。

VRChatのアバター(やその他色々)は、カメラや鏡の表示の関係で、様々なレイヤーに分けられています。

カメラ・レイヤーの仕組みについては、詳しく知りたい方はこちらのサイトを参考にしてください。

今回の問題について必要な部分だけ最低限説明すると、自分の視点から見える自分のアバターは、 "PlayerLocal" というレイヤーに所属しています。

"PlayerLocal" レイヤーでは、自分の視点の邪魔にならないように、Head の Scale が 0 になって、Head配下の物が全て非表示になります。
自分の視点的に見えないだけで、実はデュラハン状態になっているのです。

そして、どうやら Parent Constraint の Sources 等で Headボーン配下の物を指定した場合、この Scale が 0 になっている状態を参照してしまい、小さくなって見えなくなっている頭 = 首の所、にくっ付いてしまう、という現象のようです。

実はこの不具合、自分から見た画面のみで発生しています。(カメラ・鏡含む)
首にめり込んでるように見える状態でも、他人から見ると正常に頭の上についてるように見えるんですね。

なので、別に自分の画面で鏡を見た時におかしくても気にしない!写真も自分じゃ撮らない!他人にちゃんと見えてるならいいや!って人は修正の必要はありません。

何とかしたい人は次の項目へ。


Parent Constraint の Head配下の表示不具合改善手順

では、改善の具体的な手順の説明になります。

考え方としては、Head配下がダメなら、疑似Headを作って利用しよう!という考え方になります。


スクリーンショット (220)

まず、アバターのHeadボーン上で右クリック → Create Empty をクリック。


スクリーンショット (221)

Head配下に、空のオブジェクトが出来ました。


スクリーンショット (222)

出来たオブジェクトの名前を適当な名前に変更。
(何でもいいですが、今回はFake Headにしました。)

このオブジェクトは、作られたばかりなので Transform の Position、Rotation が 0 、Scale が 1 になっています。
Transform の数字は上位の物からの相対的な位置・角度・サイズになるので、Headと同じ位置、角度、サイズは同じという事になります。


スクリーンショット (222) - コピー

名前を変えた偽Head を、Neck にドラッグ&ドロップで放り込みます。


スクリーンショット (223)

Neck配下、真Head と偽Head が同じ階層に配置されました。


スクリーンショット (224)

元々あるHead と、今作った偽Head のTransform の数値が(ほぼ)同じである事を確認しましょう。微妙な差が出てしまう事がありますが、大体同じなら問題ありません。


スクリーンショット (226)

次は、偽Head のInspector で Add Component をクリックして、Rotation Constraint を検索、クリックして追加します。


スクリーンショット (227)

つきました。

Rotation Constraint は、前回の記事のConstraint の種類の所で簡単に触れましたが、対象の角度のみ影響を受けるConstraintです。
例:頭の上にお花を生やしてRotation Constraintを付けて、Sourcesに右腕を指定すると、手の動きに同期して花が傾く…など


スクリーンショット (228)

Rotation Constraintも影響を受ける対象を選ばなければいけないので、前回のParent Constraintと同様、Sourcesを指定する必要が有ります。
まずは + をクリックして枠を増やしましょう。1つで大丈夫です。


スクリーンショット (230)

次は、作ったSources の枠に、Headボーンを指定します。


スクリーンショット (237)

前回と同様に、初期化・有効化していきます。
今回はめんどくさいので、そのままZeroを押しましょう。

前回は、Sourcesを0にしてからZeroを押しました。
今回の内容だと、Sourcesを1のままZeroを押した場合と、0のまま押した場合、Constraint Settingの中のRotation At Rest の数値だけ差が出ます。
詳細は省きますが、今回はSources は1のままずっと動作させる事になり、その場合はRotation At Rest の数値は何の影響も及ぼしません。
Sources をいちいち 1 → 0 → 1 とするのが面倒なので、そのままZeroを押しました。


スクリーンショット (234)

はい、これで偽Headの設定は完了です。
手順通りならSourcesは1のままの筈ですが、念の為1になっているか確認しておきましょう。

ボーン構造:Neck配下に居るのでHeadと同じ。
Position:最初に作られた時からHeadと同じ数値。Head自体が移動する事は無く、Neckにつながっているので他の場所の移動で受ける影響も同じ。
Rotation:Rotation Constraint でHeadのRotationの数値と同じになる為、Headと同じ角度になる。
Scale:最初に作られた時からHeadと同じ数値。

という事で、彼は見た目こそ透明なものの、真・Headの動きをトレースする存在として生まれ変わりました。
上で説明した通り、真・HeadはVRChat内でScale を0 にされてしまいますが、偽Headはその影響を受けません。


スクリーンショット (235)

さて、偽Headが出来たので、後は前回の手順通りに進めましょう。
前回の手順と一点だけ違うところは、位置合わせなどをした Parent Constraint の接続ポイントを、Headの代わりに偽Head配下に放り込みましょう。
今回は、普通に目の前にかけているポイントと、おでこ眼鏡ポイントを作りました。(あと、写ってませんが手にも持てるようにしました)


動作確認してみましたが、無事頭に表示されてます。お疲れさまでした!

これで問題解決!この記事も終わりです!
…と言いたいところですが


新たなる問題

さて、今回はParent ConstraintをHead配下につけた場合の表示の問題を改善したわけですが…

実はこの手順通りに設定しても、まだ別の問題が残っています。

そもそも、不具合が出る理由の所で解説したのですが、通常Head配下につけた物(眼鏡・帽子・仮面など)は、視界の邪魔にならないよう自分の視点では写らないようになっています。

ですが、Parent Constraint で頭の位置に持って行った場合、眼鏡などのオブジェクト本体がHead配下に有る訳ではないので…

スクリーンショット (236)

こうなります。
(分かりやすいよう、眼鏡を多少前に出してます)

常に顔の前に表示される事になり、非常に鬱陶しい状態になってしまいます…
もちろん、小さめの帽子や髪飾りなど、頭の上の方につける物であれば視界に入らないので実害は在りません。

眼鏡や仮面など顔の前に来る物でこの問題を解決したい場合は、多少であれば View Position を邪魔になる物より前に出す事で解決します。
上記の眼鏡程度なら、通常より気持ち視点を上と前にすることで視界には映らなくなります。
余りに大きい物(天狗のお面とか…?)だと無理かもしれません。

View Positionをいじってもどうしても視界に映る、大きすぎてView Positionを凄く前に出さないといけない、となった場合、残念ながら私には解決法が分かりません…

他人からは見えるし鏡やカメラにも映るけど、自分には見えない、という機能をもったシェーダー、なんてものが有ればそれを使えば行ける気もします。
可能かは知りません。多分出来そうな気はします。捜索or自作を頑張ってください。


以上で、Parent ConstraintのHead配下での表示不具合についての記事を終わります。お疲れさまでした。

この記事が気に入ったらサポートをしてみませんか?