Udon Graph でテレポートを実装しようとしたときに現れた型
XYZに加えて W という単位がある
Y:0 だと90度角度が違ったので、Y:90 として90度変えようとしたら180度回ってしまって
よくわからなくなったので確認した
Quaternion : 四元数 と言う
四元数 – Wikipedia
wikipedia 冒頭から すぐには理解に至れない解説がある
私も理解をいったん諦めた
これを理解するためには数学者に入門する必要がある
ただ、昨今の3Dゲームにおいては 必要な考え方であることだけはわかる
ゆえにこれを理解できないと 3Dゲームを作ることは厳しい・・ということだろうか
数学者にならずに扱うにはどうするのか
つまり、Quaternion 型を扱うには、数学者となり、計算しないと正しい結果を出せないことがわかった
じゃあ、VRChat のワールドを実装したいがために 四元数という数学を学ぶ必要があるか
というと、流石に Unity や Udon はそこまで不親切ではない
下記、代替手段を用いる
Euler による Vector3型からの変換
Udon Graph にて Quaternion.Euler 関数を用いて、Vector3 型から Quaternion 型の変換を行う
Vector3 型による指定は 3D オブジェクトの配置で馴染みがある型
例えば90度向きを変えたいのであれば Y:90 を指定する
これで一応 Quaternion 型は解決できる
(付録) VRChat World におけるテレポートの実装
ものを触るとテレポートする、の実装
TeleportPos、TeleportRot はPublicな変数にしている
ロジックは下記の通り
- Vector3型 変数である「TeleportPos」(移動先)、「TeleportRot」(回転量) を読み込む
- 「TeleportRot」を Quaternion.Euler 関数により Quaternion 型に変換
- イベント「Interact」(対象オブジェクトを「Use」したときに動作) が発生したときに、VRCPlayerApi.TeleportTo を処理する
- 対象は Networking.Get LocalPlayer (それを行ったプレイヤー) とする
- teleportPos、teleportRot は変数「TeleportPos」「TeleportRot」の値を採用する
Publicとした変数は 「Public Variables」欄に現れる
これで Udon Graph をいちいち開かなくても、Unity の Inspecter から値が指定できる
また、このプログラムを1つ作れば、「Program Source」で同じものを指定するだけで
他オブジェクトでも転用できる
他参考資料
【Unity】 Quaternionの使い方 – エフアンダーバー (f-sp.com)
当記事では Euler を扱ったが、他にも変換できる関数がある