【VRChat】 ワールドに配置して持った時特定の方向を向く物の作り方

 本来ワールドに設置した物を持つとき、最小限の設定だと「どの方向から持つか」で持った時の向きが変わるようになっています。その方がいい場合も多いと思いますが、「VRC home」のQVpenのようにどこから持っても特定の方向を向いてほしいということもあります。(図1)

 アバターに追従するタイプの説明は多くあったものの、ワールドに配置するものでこの挙動をする方法は説明がなかなか見つからず苦労したのでここに記しておきます。(※この方法が正しいか、また合理的かどうかはわかりません、ご了承ください)

図1-1:どこから持つかで手元の向きが違う
図1-2:どこから持っても手元の向きは固定

1.オブジェクトを持てるようにする

 前段階としてオブジェクトを持てるようにする方法を一応説明しておきます。

  1. 対象のオブジェクトを選択して、「Inspector」の一番下にある「Add Component」(図2)を押す。
  2. 「VRC Pickup」を追加(図3)、自動で「Rigid Body」も追加される。
  3. 「Collider」を追加(図4)、範囲は「Edit Collider」で変えられる(図5)。

 一通り追加し終わったら各設定を変更します。

  1. 「VRC Pickup」内の「Pickupable」チェックを入れる。(持てるようにする)[必要]
  2. 「Collider」内の「Is Trigger」チェックを外す。(すり抜けなくする)[必要]
  3. 「Rigid Body」内の「Use Gravity」チェックを外す。(重力をなくす)[変更可]
  4. 「Rigid Body」内の「Is Kinematic」チェックを入れる。(空中で静止する)[変更可]

 これでひとまずオブジェクトが持てるようになったと思います。

図2
図3
図4
図5

2.持った時の向きを固定する

 ここからが本題となります。今までの状態では「どこから持つか」で持った時の方向が変わるので、持った時に特定の方向になるようにしていきます。

  1. 持つオブジェクトの「Inspector」内で「Transform」の値をリセットする(図6)。
  2. 「Hierarchy」内に「Create Empty」で「空のオブジェクト」を作る(図7)。
  3. 「VRC Pickup」内の「Orientation」を「Grip」にする(図8)。
  4. 「VRC Pickup」内の「Exact Grip」で先程追加した「空のオブジェクト」を選択する(図8)。
  5. 「Hierarchy」内で「空のオブジェクト」を「持つオブジェクト(練習用)」の子にする(図9)。
図6
図7
図8
図9

3.設定内容の説明

●Transformのリセットについて

持つオブジェクトと空のオブジェクトの位置を合わせておかないと、「持つ」→「離す」を繰り返した時にどんどん手元からずれていくので、「Transform」をリセットしています。2つのオブジェクトを親子関係にした後に親オブジェクトを動かせば問題なく好きな場所に配置できます。

    ●OrientationのGripとGunについて

    GripとGunはどちらにしても同じように特定の方向を向かすことができましたが、持つ手の形は特に変わらないようです。おそらく持った時の物の初期角度の違いかなと思います(図10)。VRで試せてないのでデスクトップ操作での推測になります。

    ●オブジェクトの親子関係について

    持った時の方向を特定する「空のオブジェクト」が「持つオブジェクト」と常に同じ動きをしていないと、「持つ」→「離す」をした後もう一回「持つ」を行ったとき正しく方向を特定できなくなるので、2つのオブジェクトを親子関係にしています。Transformのリセットで重ねた2つのオブジェクトの中心を、その後の動作でずらさないようにするためみたいなイメージです。

    図10-1:Grip
    図10-2:Gun

    4.持った時の方向の調整

     これでオブジェクトを持った時に特定の方向を向くようになったので、あとはその方向を調整します。持った状態の方向は子オブジェクトである「空のオブジェクト」から変更することでできます。他にもっといい方法があると思いますが、一応手順を紹介しておきます。

    1. 上の方の▶を押して「Play mode」にする。
    2. 「持つオブジェクト」を持って方向を確認する。
    3. 「escキー」か「windowsロゴキー」のボタンを押してPlay modeの操作から一旦離れる。
    4. 「空のオブジェクト」の「Transform」→「Rotation」を変更する。
    5. 2~4を繰り返す(図11)。

     Play modeを終了するとその間の変更はリセットされるので、ちょうどいい方向が見つかったら値をメモしておいて、Play mode終了後に改めて入力すると良いです。

    図11

    5.他の設定も試してみる

     どこから持っても望んだ方向を向くようになったので、最初の方にいじった他の設定も適用できるか試してみました。

    ●重力あり+静止なし

     「Rigid Body」内の「Use Gravity」にチェック入れる+「Is Kinematic」のチェックを外す。空中で静止せず重力に従って落下します。(図12)

    図12

    ●重力なし+静止なし

     「Rigid Body」内の「Use Gravity」のチェック外す+「Is Kinematic」のチェックを外す。初期は空中で静止してますが動き始めると無重力のように動き続けます。(図13)

    図13

    ●パーティクルと親子関係にする

     今回この方法を探し始めたきっかけです。オブジェクトをどこから持っても正面にパーティクルが飛んでほしかったのでパーティクルを「空のオブジェクト」の子にしてみます。パーティクルは「持つオブジェクト」と同じメッシュが山なりに飛んでいくものです。(図14)

    図14

     いずれも意図した挙動になったので一安心です。(VRだとどうか分かりませんが)普段デスクトップ操作だと物を持つ時自然な持ち方ができないことが多いように感じました。また特別な効果を入れているオブジェクトだと、実際に使って一度間違ってから自分で向きを調節するのは単純にストレスですし、先を見てしまったがっかり感にもなります。

     冒頭で述べたようにこれが正しい方法かは分かりませんが、一応この手の課題の解決策として使える部分はあるのではないかと思います。作りたいものを作るときに今回の記事が方法を探す手間を少しでも短縮できたなら幸いです。