Quaternionについて
Quaternionたまに使うといつもよくわからなくなるので、
備忘録的にまとめてみました。
よく使う書き方だけメモ。
資料はこちら
よく使う回転系の処理
-
transform.Rotateである軸を中心に指定角度分回転できる
this.transform.Rotate(new Vector3(0,1,0),10); // Y軸を回転軸にして10度ずつ回転
-
transform.Rotateでワールド座標基準で、現在の回転量へ加算する
this.transform.Rotate(1.0f,1.0f,1.0f,Space.World);
-
ゲームオブジェクトが向いている方向のベクトルを取得する
this.transform.forward
これは以下と同じ意味になる
this.transform.rotation * Vector3.up
また、ワールド座標の指定した方向の単位ベクトルを取得したいときは以下のように書く
var angles = new Vector3(0f, 45f, 0f); // Y軸を回転軸として45度回転した方向 var direction = Quaternion.Euler(angles) * Vector3.forward;
-
Rotation同士をかけると2つの回転を加算したQuaternionを取得できる
今対象としているゲームオブジェクト(this)の向きに、上記で定義したdirectionの方向の角度を加算したい場合は以下のようにQuaternionをかけてあげるだけで方向を変えることができる。
this.transform.rotation = Quaternion.LookRotation(direction) * this.transform.rotation; // directionは上記で作成した単位方向ベクトル
また、上記の方向を回転させる処理を一文で書くと以下のようになる。
this.transform.rotation = Quaternion.Euler(new Vector3(0f, 45f, 0f)) * this.transform.rotation;
-
時間をかけてゆっくりとゲームオブジェクトを指定の方向へ向かせる
Slerpまたはlerpを使うことでゆっくり回転できる。
transform.rotation = Quaternion.Slerp(startPosition.rotation, targetDir, step); // 現在のゲームオブジェクトの角度から目標の角度までゆっくりと回転させる
startPosition.rotation : 初期の回転角度(だいたい対象のゲームオブジェクトの現在の角度)
targetDir : 目標の回転角度
step : 補完率(0~1) つまり0なら初期の角度 0.5なら初期と目標の角度の中間の角度まで回転
サンプルプロジェクト内のデバッグキー操作
- Aキー Y軸を回転軸にして10度ずつ回転(Rotate関数)
- Bキー ワールド座標基準で、現在の角度にRotation[1,1,1]を加算する(Rotate関数)
- Cキー Y軸を回転軸にして90度回転した方向へゲームオブジェクトを回転
- Dキー 現在のゲームオブジェクトの角度にY軸を回転軸にして45度回転を追加する
- Eキー ゲームオブジェクトをY軸を回転軸にして45度回転させる(Lerp関数)
- Xキー ゆっくりゲームオブジェクトを指定の角度まで回転(Slerp関数)
参考資料
- forwardとはどういう計算をしているか
- Quaternion同士をかけると回転させられるという説明
- LookAt関数について
- Quaternionの使い方全般
- 二点間角度取得&ゆっくり回す
- transform.Rotateについて
- Quaternion復習