見出し画像

Resoniteでモノがユーザーや特定の方向を向くやうにする方法【LookAt・LookAtUser・AutoLookAtUser・AxisRotationAligner】

どうも、萬朶櫻です。

ゲームなどでは、常にプレイヤーの方を向きつづける物體オブジェクトなんかがあると思ひます。

Resoniteでもそれを再現できることが判つたので、やり方を書いていきます。


「自分」に向かせる

2通りの方法がある。

  1. その場に居る全ての「自分」に向かせる

  2. 特定の「自分」だけに向かせる

前提の説明

VRの仕樣による特有の擧動きよどうのため、理解が難しいかもしれない。そのため、以下の状態を例として説明する。

ユーザーA(自分)とユーザーB(フレンド)が同じセッションにゐて、その先に謎のオブジェがある。
オブジェは正面の扉を向いてゐて、どちらのユーザーにも向いてゐない

【その場に居る全ての「自分」に向かせる】とは、以下のやうな状態である。

  • ユーザーAから見たら、オブジェはユーザーAを向いてゐる

  • ユーザーBから見たら、オブジェはユーザーBを向いてゐる

「ユーザーAを向いてゐる状態」と「ユーザーBを向いてゐる状態」
2つの状態が同時に存在してゐる

むりやり客觀的に表現するとこんな感じ。現實げんじつではあり得ない擧動ができる。


【特定の自分だけに向かせる】とは、以下のやうな状態である。

  • ユーザーAから見たら、オブジェはユーザーAを向いてゐる

  • ユーザーBから見たら、オブジェはユーザーAを向いてゐる

こちらは現實に即した状態である。

その場に居る全ての「自分」に向かせる(LookAtUser)

LookAtUserコンポーネントを用ゐる。LookAtUserの場所は以下の通り。

LookAtUserを充てた状態。

このコンポーネントは、そのままでは機能せず、「誰にたいして向くのか」を指定しなければならない。

TargetAtLocalUserにチェックを入れると、各自の方向に向くやうになる。

特定の「自分」だけに「常に」向かせる(LookAtUser・AutoLookAtUser)

この状態を常に維持する
途中で他のユーザーに注目を切り替へない

LookAtUserの場合、「TargetUser」のnullになってゐる領域に、向かせたいユーザーのIDを入れて、「TargetAtLocalUser」のチェックを外す。


後述のAutoLookAtUserでも同樣の動きができる。

「TagetedUser」のnullになってゐる領域に、向かせたいユーザーのIDを入れて、「AutoTarget」のチェックを外す。

特定のユーザーのIDを狙って取得する方法はよく解らなかった。

そのため筆者は、一旦「AutoTarget」にチェックを入れて距離を調整し、目的のユーザーにTargetが定まったのを見計らって「AutoTarget」のチェックを外す。といふやり方をしてゐる。

「一番近い」特定の「自分」だけに向かせる(AutoLookAtUser)

AutoLookAtUserを用ゐる。AutoLookAtUserは、LookAtUserと同じ階層にある。

このコンポーネントは、充てた瞬間から動作する。このコンポーネントの初期値での動き方は以下の通り。

  • 「RetargetDistance(注視對象たいしやうの再設定をする距離)」で決めた距離(デフォルトでは0.5メートル)の中にゐる、最も近いユーザーを注視する

  • 注視中のユーザーがRetargetDistance内に居るうちは、そのユーザーを注視しつづける

  • 注視してゐるユーザーがRetargetDistanceよりも遠くに行ったら、もう一度、誰を注視するかを決め直す

また「AutoTarget」のチェックを外すと、RetargetDistanceに關係なく、そのユーザーに注視が固定される。

「特定の物體など」に向かせる(LookAt)

片方がもう片方を注視する

LookAtを用ゐる。LookAtは、LookAtUserなどと同じ階層にある。

このコンポーネントは、そのままでは機能せず、「何に對して向くのか」を指定しなければならない。

以下のやうに向かせたい對象たいしやう物體オブジェクト(この場合は「Cone - Parent」)を右クリックで摑んでLookAtの「Target」のnullになってゐる所に持っていき、離す。

畫像ではTargetは「Box~~」になってゐるが、氣にしなくてよい

成功すると、以下の通り、「輕」のオブジェが白いコーンを注視するやうになる。

コーンを動かしてもオブジェはコーンに向き續ける。

白いコーン(左)が注視される對象
輕いオブジェ(右)がLookAtを入れた物體

雙方さうはうが向かひ合ふ

雙方向さうはうかう、つまり「2つの物體オブジェクトが互ひに向かひ合ふ」状態を作りたい時、雙方にLookAtを充てて、互ひの階層をTargetにすれば良い。

しかし、同じ階層にGrabbable系のコンポーネントがあると、うまく動かないことがある。

具體ぐたい的には、摑んだり離したりする度に、摑んでゐた物體の向きがコロコロはる。と云った動きである。

それを防ぐには、以下の通りに親子化して、親の階層にGrabbableを充てると良い

それぞれの子の階層には、LookAtが充てられてゐる
それぞれの親の階層には、Grabbableが充てられてゐる

かうすることで、摑んでもスムーズに向きを制禦せいぎよできるやうになる。

互ひに向き合ふ2つの物體
コーンの向きは、尖った方を正面にするために子のrotationを弄ってゐる

特定の座標に向かせる(LookAt)

  • ワールド座標の任意の座標

  • 特定の物體から○○メートル離れた座標

これら抽象的な場所も注視させることができる。

ワールド座標の任意の座標

  • 「Target」と「LocalSpace」を「null」にしておく(nullでない場合は右の「∅」を押す)。

  • 「Default」を「WorldRoot」にする

  • 「TargetPoint」に好きな値を入力する

ワールド座標の「0,0,0」を指定すると、スポーンポイントの中心を注視してゐる。

特定の物體から○○メートル離れた座標

  • 「Target」を「null」にしておく(nullでない場合は右の「∅」を押す)

  • 「LocalSpace」に基準とするスロット(物體オブジェクト)を入れる

  • 「Default」は何でも良い。デフォルトでは「WorldRoot」

  • 「TargetPoint」に好きな値を入力する

以下はLocalSpaceを「LookAt Test」を指定し、TargetPointに「0,0,0」とした樣子。

「LookAt Test」の原點ぐゑんてん(カラフルな矢印がある所)を注視してゐる。

特定の軸に沿って向きを固定する(AxisRotationAligner)

「LookAt」は特定の座標を注視するため、その物體オブジェクトが移動すると角度も一緒にはってしまふ。

コーンに「LookAt」を充て、Targetを空中の球に設定。
現在、コーンは上を向いてゐるが……
移動すると、コーンが傾く。

これを防ぐことができるコンポーネントが「AxisRotationAligner」である。「AxisRotationAligner」の階層は以下。

コーンに「AxisRotationAligner」を入れた状態

初期設定では、Y軸(高さ方向)が固定される。

「LocalDirection」や「TargetDirection」を變更へんかうすることで、固定する向きをへることが出來る。

AxisRotationAlignerを充てたコーンを手に持つ
移動してもコーンは上を向いたままである。

寫眞しやしんでは分かりづらいが、手首をひねってコーンを横倒しにしようとしても、コーンの向きは上を向いたままになる。


これに關連して、「○○Aligner」と名の付くコンポーネントの紹介記事も書いてます。

摑むと暴れ囘る原因と對策たいさく

例へば以下のやうな階層構造で、「Grabbable」コンポーネントを付けてゐるスロットを「Target」や「LocalSpace」に指定すると、摑んだ時に暴れ囘る。

對策としては、それ以外のスロットを指定すると良い。上記畫像で言へば、「LookAt Test」や「Box」である。

各コンポーネントの項目について

MaxSwingやMaxTwistと云った項目は、以前紹介したJointコンポーネントと共通するものであるから、そちらも參照されたい。

LookAt

  • persistent: このコンポーネントが付いたモノを保存する時、このコンポーネントも一緒に保存するかどうか

  • UpdateOrder: このコンポーネントの更新順序

  • Enabled: このコンポーネントを有效・無效

  • Target: 注視する對象たいしやうを指定


【より細かく注視先を決める項目】
※以下の項目を弄るときは、↑にある「Target」をnullにしておく。

  • TargetPoint: ここで指定した座標を注視する

  • TargetPointSpace: どの座標系を使用するか

  • LocalSpace: 基準となる注視對象たいしやうを指定する。nullだと「Default」の項目が參照される

  • UseParentSpace:

    • チェックを入れない: LocalSpaceで指定したスロット(物體オブジェクト)を注視

    • チェックを入れる: LocalSpaceで指定したスロットの親スロットを注視。(なので、WorldRoot直下の物をLocalSpaceにしてゐると事實上じじつじやうWorldRootを參照する)

  • Default: LocalSpaceが「null」の時、どこを參照するか。

    • WorldRoot: ワールドの座標

    • LocalUserSpace: (不明)

    • LocalUserRoot: ユーザーのローカル座標

  • OverrideRootSpace直譯ちよくやくすると「ルートスペースを優先する」だが、意味は不明

  • [Use Global Space]: 押すと、自動でLocalSpaceが「null」になり、UseParentSpaceのチェックが外れる

  • [Use Local Space]: 押すと、自動でLocalSpaceに「このコンポーネントを充てた物體の階層」が割り當てられ、UseParentSpaceのチェックが外れる

  • [Use Parent Space]: 押すと、自動でLocalSpaceに「このコンポーネントを充てた物體の階層」が割り當てられ、UseParentSpaceのチェックが入る


【どんな風に向かせるか】

  • Up: 對象に注目する時、どの軸を上にするか

  • RotationOffset: その物體の向きを何度ずらすか

  • SwingReference: どの軸でSwingするか。複數の軸を組み合はせて斜めにもできる

  • TwistReference: どの軸でTwistするか。複數の軸を組み合はせて斜めにもできる

  • MaxSwing: 3Dスティック風の動きをさせる時の最大角。角度を數値で指定。角度を數値で指定。0で固定。90よりも大きい數値を入れても無意味。

  • MaxTwist: ターンテーブル風の動きをさせる時の最大角。角度を數値で指定。0で固定。180よりも大きい數値を入れても無意味。

  • _target: このコンポーネントで算出した數値valueをどの物體の囘轉rotationに適用するか。初期値はそのコンポーネントを充てた物體オブジェクト囘轉rotationが自動で割りてられる

  • [Set Swing Reference from current rotation]: 押すと、自動でSwingReferenceとTwistReferenceとの値がよく解らない數値になる。何の意味があるのかは謎

LookAtUser

  • persistent: このコンポーネントが付いたモノを保存する時、このコンポーネントも一緒に保存するかどうか

  • UpdateOrder: このコンポーネントの更新順序

  • Enabled: このコンポーネントを有效・無效


  • TargetUser: 注視するユーザーを指定

  • TargetAtLocalUser: 全てのユーザーを注視する

  • SourcePositionOffset: (恐らく)注視對象から何メートル視點をずらすか

  • Invert: 反轉。チェックを入れると逆を向く

  • RotationOffset: その物體の向きを何度ずらすか

  • PositionSource: ユーザーのどの部分を注視するか。「Head(頭)・View(目の位置)・Root(腰または足元)」の3つから選べる

  • AroundAxis: 「Axis」で決めた軸で固定。

  • Axis: 「AroundAxis」で固定する軸。例へば「x=0, y=1, z=0」だと左右にしか動かなくなる

  • _rotationDrive: このコンポーネントで算出した數値valueをどの物體の囘轉rotationに適用するか。初期値はそのコンポーネントを充てた物體オブジェクト囘轉rotationが自動で割りてられる

AutoLookAtUser

  • persistent: このコンポーネントが付いたモノを保存する時、このコンポーネントも一緒に保存するかどうか

  • UpdateOrder: このコンポーネントの更新順序

  • Enabled: このコンポーネントを有效・無效

  • RetargetDistance: 注視對象が切り替はる距離(メートル)。

  • LerpSpeed: 追從する速度。値が大きいほど素早く追從する。

  • TargetedUser: 注視するユーザーを指定

  • AutoTarget: チェックを入れると、「RetargetDistance」で決めた距離に基づいて注視するユーザーを自動で切り替へる。

  • ExcludeActiveUser: 直譯すると「アクティブユーザーを除外」だが、意味はよく解らない。

  • SwingReference: どの軸でSwingするか。複數の軸を組み合はせて斜めにもできる

  • TwistReference: どの軸でTwistするか。複數の軸を組み合はせて斜めにもできる

  • MaxSwing: 3Dスティック風の動きをさせる時の最大角。角度を數値で指定。角度を數値で指定。0で固定。90よりも大きい數値を入れても無意味。

  • MaxTwist: ターンテーブル風の動きをさせる時の最大角。角度を數値で指定。0で固定。180よりも大きい數値を入れても無意味。

  • _rotation: このコンポーネントで算出した數値valueをどの物體の囘轉rotationに適用するか。初期値はそのコンポーネントを充てた物體オブジェクト囘轉rotationが自動で割りてられる

AxisRotationAligner

コーンに「AxisRotationAligner」を入れた状態
  • Persistent: このコンポーネントを充てられてゐる物をインベントリなどに保存する時に、このコンポーネントも一緒に保存するかどうか

  • UpdateOrder: このコンポーネントの更新順序

  • Enabled: このコンポーネントを有效・無效


  • LocalDirection

  • TargetDirection

向きを決める項目。この2つの違ひはよく解らなかった。


これらの項目は「LookAt」を參照。


LocalRotation: 現在のローカル座標における角度。あまり氣にしなくてよい。
_rotation: どの囘轉くわいてん角度をこのコンポーネントで制禦するか。初期設定ではこのコンポーネントを充てたスロット(物體オブジェクト)のRotationが自動で充てられる。

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