-
Unity ではTransform の Rotation(角度)は
-
クォータニオン(四元数)で格納されます
-
これはベクトルと似ていますが
-
X Y Z W の 4 個のコンポーネントから構成されます
-
各コンポーネントは相互に影響し合い
-
オブジェクトの回転を
-
定義します
-
クォータニオンを扱う上でまず覚えておくべき事は
-
X, Y, Z, W の 4 コンポーネントは
-
まとめて扱うものであり 単体で調整しては
-
いけないという点です
-
Unity にはクォータニオンを簡単に管理するための
-
ビルトイン機能が多数備わっています
-
さて回転を管理するシステムは
-
おそらく聞きなじみのある
-
「オイラー角」です
-
インスペクターで表示される Rotation の値も
-
利便性の高さからこのシステムを使っています
-
オイラー角における回転は それぞれ X 軸
-
Y 軸 Z 軸の回転をベースとしています
-
では オイラー角のほうが分かりやすいなら
-
なぜ Unity ではクォータニオンを使っているのでしょう?
-
ましてやなぜインスペクターで表示するオイラー角を
-
わざわざクォータニオンから変換しているのでしょう
-
端的に言えば オイラー角では
-
ジンバルロックが発生してしまい
-
その結果 増分回転が正しく動作しなくなるからです
-
Unity では回転を
-
クォータニオンで格納することでジンバルロックを
-
回避しているのです
-
それでは Quaternion クラスで使える機能を
-
見ていくとしましょう
-
まずは LookRotation 関数を見ていきます
-
さて ここにキャラクターとオーブが配置されたシーンがあります
-
キャラクターには LookAtScript というスクリプトが
-
アタッチされています
-
一方のオーブには MotionScript というスクリプトが
-
アタッチされています
-
MotionScript はオブジェクトを Horizontal 入力軸に沿って
-
単純に左右に移動させるスクリプトです
-
LookOutScript には target Transform の
-
public フィールドがあり さらにここの Update 関数で
-
LookRotation を使ってオブジェクトを
-
target を向くよう回転させます
-
LookRotation 関数は Vector3 を取り
-
パースされた Vector3 に合った
-
回転をクォータニオンで返します
-
オブジェクトとターゲット間の相対ベクトルを
-
計算することでオブジェクトのZ軸を
-
ターゲットのほうに
-
向かせることができます
-
Transform.LookAt と似た仕組みですが
-
クォータニオンを用いたほうがより明示的な指定になります
-
なお この関数は 2 個の
-
Vector3 をパースすることができます
-
このとき 2 個めの Vector3 はどちらの方向が
-
上かを指定します
-
さて Unity に戻りシーンを実行してみましょう
-
オーブをどこに動かしてもキャラクターがそちらに顔を
-
向けるのが確認できますね
-
次に見ていく関数は
-
Slerp 関数です
-
Slerp は Spherical Interpolation(球面線形補間)の略です
-
lerp 関数と非常によく似てますが
-
そちらは Linear Interpolation(線形補間)です
-
両者の最大の違いは lerp が 2 つの
-
クォータニオン間で均等に
-
補間するのに対し slerp は
-
曲線的に補間する点です
-
結果 lerp は均等な結果を
-
返すのに対し slerp は始点と終端近くで遅く
-
中盤で速くなります
-
さて今度もキャラクターとオーブのあるシーンです
-
今回のキャラクターにはスクリプトがアタッチされていません
-
一方のオーブには Gravity スクリプトがアタッチされています
-
このシーンでは slerp と前移動を活用して
-
重力軌道的な移動を実現してみます
-
Gravity スクリプトの構成は先ほどの
-
LookAt スクリプトと似ています
-
今回も target Transform の public フィールドがあり
-
オブジェクトとターゲット間の相対ベクトルを
-
計算します ただし今回は
-
オーブの高さを考慮したオフセットを追加します
-
また今回も LookRotation を計算していますが
-
今回は計算結果をオブジェクトの
-
Transform の回転に格納していません
-
代わりに今回はクォータニオン変数である
-
rotation に格納します
-
そしてオブジェクトの localRotation を
-
クォータニオン変数 Current に格納します
-
その後 slerp 関数を使い オブジェクトが
-
ターゲットの方をゆっくりと向くようにします
-
slerp 関数はまず current の回転を読み
-
最終結果の回転を読み そして
-
補間または向き変更の速度を読みます
-
即時ではなく時間をかけて
-
回転するのがこのサンプルを
-
機能させるカギとなっています
-
そしてオブジェクトがややターゲットの方を向いたところで
-
少しだけオブジェクトを前進させます
-
では Unity に戻ってシーンを実行し
-
結果を確認してみましょう
-
オーブは前進を続けながら
-
ターゲット... 今回はキャラクターのほうを
-
向き続けています
-
きれいな重力軌道が描けましたね
-
さてレッスン最後に見ていくのは
-
Quaternion クラスの identity プロパティです
-
クォータニオンを Quaternion.identity にセットすると
-
そのオイラー角が
-
(0,0,0) または回転なしに設定されます
-
Quaternion クラスにはこの他にもさまざまな関数が
-
あります 詳細は下記リンク先のドキュメントをご覧ください
-
最後に このレッスンで一番覚えておいて欲しい点を改めて
-
クォータニオンは回転を制御する
-
最適な方法で そのコンポーネントは個別に
-
調節してはいけません
-
そうしなくとも大丈夫な機能が
-
かならず用意されているはずですから