Unity入門シリーズ、今回は「Quaternion」についての記事となります。

「Quaternionとは何か、どのように利用すればいいのか」などと悩んでいる方はいませんか。本記事では、Unityの初心者の方に向け、Quaternionに関する知識や使い方について紹介しています。

ぜひ最後までお読みください。

Unityについて詳しく知りたいという方は、下記記事をご覧ください。

Unityとは?特徴や作品事例、価格など徹底解説!
Unityとは?特徴や作品事例、価格など徹底解説!

|Quaternionとは

出典:https://docs.unity3d.com/ja/2019.4/ScriptReference/Quaternion.html

Quaternionとは、3次元空間における回転を表現するために使われる概念です。

Unityでは、物体を回転させるために利用されています。 回転を簡単に制御することができ、スムーズな回転効果を得ることができます。

また、角度の自由が失われるといったジンバルロックを回避できます。

このため、Unityを利用する上では欠かせないツールといえるでしょう。

|オイラー角との違い

「Quaternion」と「Euler Angles(オイラー角)」はどちらもUnityで広く使用される回転表現方法であり、それぞれ独自の特徴と用途を持っています。

このセクションではオイラー角とQuaternionの違いについて詳しく説明していきます。

オイラー角とは

3つの軸に角度を当てはめて回転を表すものです。直感的で理解しやすいため、初心者でも使いやすいということが利点です。

しかし、利用するためには注意点もあります。

Unityでは、回転軸の順がデフォルト設定されています。しかし、システムによっては、異なる順序を使用する場合もあります。

オイラー角を使う場合、回転軸の順序が非常に重要となります。また、連続して適用する場合、回転の順序によって結果が異なることがあります。

オイラー角との違い

次に、双方の違いについてみていきましょう。

まず、オイラー角は3つの角度の組み合わせで表現されます。非常にわかりやすい概念ですので初心者でも理解しやすいでしょう。

しかし、大きな回転や90度の倍数の回転の場合に問題が発生する可能性があります。また、ジンバルロックにより計算が不正確になることがあります。

一方、Quaternionは4次元数で、3次元空間の回転をより正確かつ効率的に表現することができます。回転だけでなく、回転の連続性と滑らかさも維持することができます。

しかし、初心者には多少わかりにくく理解に苦しむ点も多いでしょう。また、単体では180度以上の回転を表現できない点もデメリットとなります。

Unityでは、上記を総合的に鑑みた上で、基本すべて「Quaternion」が内部で採用されています。

ただしTransform Inspectorにおいてはオイラー角が採用されていますので、双方のメリットやデメリットを理解したうえで使いこなせると良いでしょう。

|Quaternionの使い方

早速ですが、Quaternionを具体的にどのように使うかを紹介します。

Quaternionを作成する

作成には、それぞれの用途ごとに合わせた関数を使用します。

次の見出しで関数については詳しくご紹介します。

Quaternionの取得

ゲームオブジェクトのtransform.rotationプロパティで四元数表現を取得します。

取得するためには、以下のサンプルコードを利用してみてください。

Quaternion myQuaternion = transform.rotation

transform.rotationは、グローバル座標でのQuaternionを返します。 

ローカル座標における回転を取得したい場合は、transform.localRotationプロパティを使用します。

Quaternionの設定

まずQuaternion newQuaternion = Quaternion.Euler(x, y, z) のコードを使い、新しいQuaternionを作成しましょう。そして、transform.rotation = newQuaternionを使います。

これにより、ゲームオブジェクトの回転が、新しい四元数によって表される回転に設定されます。

最後に、設定したQuaternionが有効になっているかどうかきちんと確認してください。

|使用される関数

次のセクションでは、Quaternionで使用される関数について解説します。

それぞれ使う場面や関数が異なりますので、用途を理解したうえで使いこなせるように練習してみてくださいね。

Quaternion.Euler

先述したオイラー角を利用して作成します。

軸ごとに回転角度を指定することができるので直感的に理解しやすいですが、UnityにおいてはQuaternionが採用されていますので上手くいかない可能性もあります。

また、ジンバルロックが発生する可能性もありますので注意しましょう。

関数:Quaternion.Euler(X軸を中心とした角度, Y軸を中心とした角度,Z軸を中心とした角度)で表されます。

(例)y軸を中心に90度回転させたい場合

Quaternion rotation = Quaternion.Euler(0,90,0)

Quaternion.AngleAxis

どの向きにどのくらい回転させるかを指定したうえで作成するものです。

角度と軸を指定するので、ます最初に理解すべき関数といえるでしょう。

関数:Quaternion.AngleAxis(角度, 軸の向き)

(例)ゲームオブジェクトをY軸を中心として時計回りに90度回転させたい場合

Quaternion rotation = Quaternion.AngleAxis(90, Vector3.up)、transform.rotation = rotation * transform.rotation

Quaternion.FromToRotation

ある方向に向いている状態から違う方向に向けて回転させたいときに使用します。

関数:Quaternion.FromToRotation(開始方向, 目標方向)

ただし、この関数を設定すると最短ルートを通りますので、思い描いたルートで回転しない場合もあります。設定後に不自然なルートになっていないかどうかを必ず確認しておきましょう。

Quaternion.LookRotation

オブジェクトを任意の方向に向かせるときに使用する関数です。

関数:Quaternion.LookRotation(正面方向, 頭上方向<省略してもよい>)

ただし、Y軸方向へ頭が、Z軸方向へ正面がそれぞれ向いているという状態を前提としているものとなります。

これを無視してしまうと思うように動作しませんので気を付けましょう。

Quaternion.identity

回転していないときの値を得ることができるものです。

オブジェクトを初期状態にリセットしたい場合はこの方法を使って空の回転(回転を持たない状態)にすることができます。

以下はQuaternion.identityの使用例です。

Quaternion rotation = Quaternion.identity、transform.rotation = rotation

|まとめ

ここまでお読みいただき、誠にありがとうございました!

本記事ではUnityゲームエンジンにおけるQuaternionについて解説しました。

Unityを利用する人にとって、正確でスムーズなオブジェクト回転を作り、よりリアルなものを表現するためにも、使い方を正しく理解することは非常に重要です。

Unityをはじめたばかりの方には分かりにくいかもしれませんが、ぜひこの記事を元に利用してみてはいかがでしょうか。