[Unity, VRChat (Udon)] Quaternion 型とかいうわけわからんもの

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な変数にしている
ロジックは下記の通り

  1. Vector3型 変数である「TeleportPos」(移動先)、「TeleportRot」(回転量) を読み込む
  2. 「TeleportRot」を Quaternion.Euler 関数により Quaternion 型に変換
  3. イベント「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 を扱ったが、他にも変換できる関数がある

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Share via
Copy link