Resoniteでモノがユーザーや特定の方向を向くやうにする方法【LookAt・LookAtUser・AutoLookAtUser・AxisRotationAligner】
どうも、萬朶櫻です。
ゲームなどでは、常にプレイヤーの方を向き續ける物體なんかがあると思ひます。
Resoniteでもそれを再現できることが判つたので、やり方を書いていきます。
「自分」に向かせる
2通りの方法がある。
その場に居る全ての「自分」に向かせる
特定の「自分」だけに向かせる
前提の説明
VRの仕樣による特有の擧動のため、理解が難しいかもしれない。そのため、以下の状態を例として説明する。
【その場に居る全ての「自分」に向かせる】とは、以下のやうな状態である。
ユーザーAから見たら、オブジェはユーザーAを向いてゐる
ユーザーBから見たら、オブジェはユーザーBを向いてゐる
むりやり客觀的に表現するとこんな感じ。現實ではあり得ない擧動ができる。
【特定の自分だけに向かせる】とは、以下のやうな状態である。
ユーザーAから見たら、オブジェはユーザーAを向いてゐる
ユーザーBから見たら、オブジェはユーザーAを向いてゐる
こちらは現實に即した状態である。
その場に居る全ての「自分」に向かせる(LookAtUser)
LookAtUserコンポーネントを用ゐる。LookAtUserの場所は以下の通り。
LookAtUserを充てた状態。
このコンポーネントは、そのままでは機能せず、「誰に對して向くのか」を指定しなければならない。
TargetAtLocalUserにチェックを入れると、各自の方向に向くやうになる。
特定の「自分」だけに「常に」向かせる(LookAtUser・AutoLookAtUser)
LookAtUserの場合、「TargetUser」のnullになってゐる領域に、向かせたいユーザーのIDを入れて、「TargetAtLocalUser」のチェックを外す。
後述のAutoLookAtUserでも同樣の動きができる。
「TagetedUser」のnullになってゐる領域に、向かせたいユーザーのIDを入れて、「AutoTarget」のチェックを外す。
「一番近い」特定の「自分」だけに向かせる(AutoLookAtUser)
AutoLookAtUserを用ゐる。AutoLookAtUserは、LookAtUserと同じ階層にある。
このコンポーネントは、充てた瞬間から動作する。このコンポーネントの初期値での動き方は以下の通り。
「RetargetDistance(注視對象の再設定をする距離)」で決めた距離(デフォルトでは0.5メートル)の中にゐる、最も近いユーザーを注視する
注視中のユーザーがRetargetDistance内に居るうちは、そのユーザーを注視しつづける
注視してゐるユーザーがRetargetDistanceよりも遠くに行ったら、もう一度、誰を注視するかを決め直す
また「AutoTarget」のチェックを外すと、RetargetDistanceに關係なく、そのユーザーに注視が固定される。
「特定の物體など」に向かせる(LookAt)
片方がもう片方を注視する
LookAtを用ゐる。LookAtは、LookAtUserなどと同じ階層にある。
このコンポーネントは、そのままでは機能せず、「何に對して向くのか」を指定しなければならない。
以下のやうに向かせたい對象の物體(この場合は「Cone - Parent」)を右クリックで摑んでLookAtの「Target」のnullになってゐる所に持っていき、離す。
成功すると、以下の通り、「輕」のオブジェが白いコーンを注視するやうになる。
コーンを動かしてもオブジェはコーンに向き續ける。
雙方が向かひ合ふ
雙方向、つまり「2つの物體が互ひに向かひ合ふ」状態を作りたい時、雙方にLookAtを充てて、互ひの階層をTargetにすれば良い。
しかし、同じ階層にGrabbable系のコンポーネントがあると、うまく動かないことがある。
具體的には、摑んだり離したりする度に、摑んでゐた物體の向きがコロコロ變はる。と云った動きである。
それを防ぐには、以下の通りに親子化して、親の階層にGrabbableを充てると良い
かうすることで、摑んでもスムーズに向きを制禦できるやうになる。
特定の座標に向かせる(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」は特定の座標を注視するため、その物體が移動すると角度も一緒に變はってしまふ。
これを防ぐことができるコンポーネントが「AxisRotationAligner」である。「AxisRotationAligner」の階層は以下。
初期設定では、Y軸(高さ方向)が固定される。
「LocalDirection」や「TargetDirection」を變更することで、固定する向きを變へることが出來る。
寫眞では分かりづらいが、手首をひねってコーンを横倒しにしようとしても、コーンの向きは上を向いたままになる。
これに關連して、「○○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: このコンポーネントで算出した數値をどの物體の囘轉に適用するか。初期値はそのコンポーネントを充てた物體の囘轉が自動で割り當てられる
[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: このコンポーネントで算出した數値をどの物體の囘轉に適用するか。初期値はそのコンポーネントを充てた物體の囘轉が自動で割り當てられる
AutoLookAtUser
persistent: このコンポーネントが付いたモノを保存する時、このコンポーネントも一緒に保存するかどうか
UpdateOrder: このコンポーネントの更新順序
Enabled: このコンポーネントを有效・無效
RetargetDistance: 注視對象が切り替はる距離(メートル)。
LerpSpeed: 追從する速度。値が大きいほど素早く追從する。
TargetedUser: 注視するユーザーを指定
AutoTarget: チェックを入れると、「RetargetDistance」で決めた距離に基づいて注視するユーザーを自動で切り替へる。
ExcludeActiveUser: 直譯すると「アクティブユーザーを除外」だが、意味はよく解らない。
SwingReference: どの軸でSwingするか。複數の軸を組み合はせて斜めにもできる
TwistReference: どの軸でTwistするか。複數の軸を組み合はせて斜めにもできる
MaxSwing: 3Dスティック風の動きをさせる時の最大角。角度を數値で指定。角度を數値で指定。0で固定。90よりも大きい數値を入れても無意味。
MaxTwist: ターンテーブル風の動きをさせる時の最大角。角度を數値で指定。0で固定。180よりも大きい數値を入れても無意味。
_rotation: このコンポーネントで算出した數値をどの物體の囘轉に適用するか。初期値はそのコンポーネントを充てた物體の囘轉が自動で割り當てられる
AxisRotationAligner
Persistent: このコンポーネントを充てられてゐる物をインベントリなどに保存する時に、このコンポーネントも一緒に保存するかどうか
UpdateOrder: このコンポーネントの更新順序
Enabled: このコンポーネントを有效・無效
LocalDirection:
TargetDirection:
向きを決める項目。この2つの違ひはよく解らなかった。
これらの項目は「LookAt」を參照。
LocalRotation: 現在のローカル座標における角度。あまり氣にしなくてよい。
_rotation: どの囘轉角度をこのコンポーネントで制禦するか。初期設定ではこのコンポーネントを充てたスロット(物體)のRotationが自動で充てられる。