6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[VRChat] 相対位置を維持するワールド固定の解説

Last updated at Posted at 2021-12-12

本記事はVRChat Advent Calendar 2021の13日目の記事です。前回はあーあーあ~さんのCauchy-Binetの公式による行列木定理の証明でした。
#はじめに
自由な場所を持てる指ペンを作りました。

これで使ってる「好きな所を持ち直せる」タイプのワールド固定(仮想ピックアップ)の解説です。
※簡単に導入するための説明はないです。原理の解説なのでアニメーション等には触れません。
#(従来型)ワールド固定の原理
まずは復習
##仮想原点
ワールド中を動き回るアバターの中に、常にワールド原点に固定される仮想原点オブジェクトを追加します。
image.png
いつものやつです。自分の位置回転を打ち消します。
原点.gif

設定時に仮想原点がワールド原点からズレているとうまく固定されません

##Constraintの無効化
ParentConstraintは有効にしてる間、ターゲットに自身の親であるかのように追随しますが、無効にすると__現在の位置回転を保ったまま__追随が切れます。
Constraint.gif

これを合わせると、原点に対して固定されたりされなかったりするオブジェクトをアバターに仕込めます。
#(新型)仮想ピックアップの原理
以下説明のために単語を定義します

単語 意味
Hand 手など持ち上げるのに使うボーン
Origin 仮想原点
Sphere 固定するオブジェクト
Point 持ち上げる際の追随点
Pickup 持ち上げた状態
Drop 固定した状態

ワールド固定を解除した際にSphereが手元に飛んでくるのは、PointとSphereが離れているからです。
Fly.png
置いた場所で持ち上げる=PointとSphereが同じ位置・回転であれば飛んで来ないですね。
NoFly.png
そういうわけで、Drop中にPointがSphereを置いた地点から動かないようにすれば、飛んでくることはなくなります。
Drop中はPointがSphereに追随するようにします。
image.png
Drop時にSphereのParentConstraintを無効にすると同時に、PointのParentConstraintを有効化します。これによって、親子関係が入れ替わります。
Pickup時は逆に、Sphereのを有効にしてPointのを無効化します。

  • Pickup中: SphereはPointに追随 PointはHandの子 => Sphereがアバターに付いてくる
  • Drop中: PointはSphereに追随 SphereはOriginの子 => Sphereはワールドに固定される この状態でPickupへ切り替えると、SphereがPointの位置へワープするが同位置にあるので飛ばない

Pickup.gif
これで仮想ピックアップが実現できました。

これだけだと位置のリセットができなくて不便なのでそちらの仕組みも作ります1
Transformを(0,0,0)とかやるとWriteDefaultsが悪さするので、ParentConstraintで、
image.png
PointをHandに親子付けしてリセットしましょう。リセット時以外はHandへのWeightを0、Spereへのを1に。リセット時はHandへのWeightを1、Sphereへのを0に切り替えればいいです。
#応用
PPPenでは手と仮想原点に対して相互に固定できる仕組みですが、左右の手にそれぞれ固定させれば武器の持ち替えのようなことができます。
頭と手にすれば帽子の位置を調節するみたいなギミックにもなります。
うまくやれば3点以上での持ち替えもできそう。
#留意点
PickupとDropを繰り返す度に位置ズレが累積するので長時間や素早い持ち替えには注意が必要です。
ExpressionParametersよりGestureの方がIKと同期タイミングが近い2ようなので、アクションに使う場合などはハンドサインの方がよさそう。
LateJoinerや持ち替え時にアバターが読み込まれていない相手にも無力です。適当なタイミングで位置リセットしてください。
#おわりに
解説中のParentConstraintは全部Offsetを0にしています。
Constraintの設定は細かい注意点が多いし、アニメーションは手順が多いし、導入手順を解説するには複雑過ぎて諦めました。
何かと活用できそうなギミックなので、理解できたら使ったり、解説したり、販売などしてもらえると嬉しいですね。

明日はmkc1370さんのUdonでプリクラを作った話になります。

  1. ペンは消せばいいので位置リセットしてません。

  2. ペンの筆記を最初はメニュー操作でやっていたのですが、他人からまともに読めません。ジェスチャ操作にしたら素早く書いても十分程度読めるようになりました。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?