こんにちは!
フリーランスプログラマーのsatoです。
今回はQuaternionについて見ていきましょう!
このQuaternionですが、オブジェクトを回転させるときに突然登場しきて困惑した人も多いと思います。
読んでもよくわからず、挫折仕掛けた人も多いのではないのでしょうか。
とはいえ、使ってみるととても役に立つ機能であることも事実です。
今回は、とてもシンプルに「使い方ベース」での説明をしますので、まずは使い方からその一歩を踏み出しましょう!
[基本] Quaternionを使ってみよう!
[基本] Quaternion同士で角度を合成!
[応用] いろいろなQuaternionを作ろう!
それではよろしくお願いいたします。
Quaternionとは?
Quaternion(クォータ二オン)を一言で言うと「回転を表すのに使用される仕組み」です。
そしてUnityは「すべての回転を表現するのにQuaternionを内部的に使用」しています。
ということは、Unityでの回転を理解する上で、やはり避けては通れない機能なわけですね…
とはいえ使うこと自体はUnityの便利関数を使用するだけなので、そこまで難しくはありません!
その辺りはご安心ください!
兎にも角にも、初心者の方は以下の3点だけ覚えておきましょう。
「Unityの回転はすべてQuaternionを使用している」
「Unityが便利関数を用意してくれているので安心!」
まずはこの辺を意識しつつ、実勢に使ってみましょう。
Quaternionを使ってみよう!
言葉だけでは実感がわかないですよね。
ですので、最初にQuaternionの取得・編集・反映をシンプルに通して見てしまいましょう!
流れさえわかればイメージできますものね!
サンプルとしてCubeオブジェクトにMyObjectというスクリプトを紐付けたものを準備しました。
MyObjectスクリプトは以下の通りです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyObject : MonoBehaviour { // 更新関数 void Update () { // xyz軸を軸にして1度、回転させているQuaternionを作成 Quaternion move_q = Quaternion.Euler(0f, 0f, 1.0f); // 自身のQuaternionを取得 Quaternion q = this.transform.rotation; // 合成して、自身に設定 this.transform.rotation = q * move_q; } }
実行した結果は以下のとおりです。
ちゃんと回転していますね!
現在の値を取得し、何か編集を加えて、設定する。
やっていることは、座標の移動などと同じですね!
今回の処理の内容を一つずつ、確認していきましょう。
Quaternionを作成する
// xyz軸を軸にして1度、回転させているQuaternion Quaternion move_q = Quaternion.Euler(0f, 0f, 1.0f);
今回使用した「Quaternion.Euler関数」は、引数にx,y,z軸を軸にした回転角度を送ることで、Quaternionを生成してくれます。
Quaternionを作るには「Euler関数」のような便利な関数が用意されています。
詳細は別途見ていくとして、このような便利な関数がたくさん準備されていることを覚えておいてください。
オブジェクトのQuaternionを取得する
自身のQuaternionは、次のような方法で取得できます。
// 自身のQuaternionを取得 Quaternion q = this.transform.rotation;
座標の取得などと同じで、非常に簡単ですね!
オブジェクトへQuaternionを設定する
設定は取得とおなじで「transform.rotation」を利用します。
先ほど作成した「move_q」を合成し、そして設定し回転させています。
// 合成して、自身に設定 this.transform.rotation = q * move_q;
合成については後ほど説明しますが、簡単にいえば、回転を足しあわせていると考えてください。
簡単に合成できる点も、Quaternionの魅力の一つです。
Quaternion同士で角度を合成!
先ほどの項目で、Quaternion同士を合成していたのを覚えていますか?
// 合成して、自身に設定 this.transform.rotation = q * move_q;
見て分かる通り、Quaternion同士を掛け合わせることで、角度の合成ができるわけです。
例えば「Quaternion A」と「Quaternion B」を掛け合わせると…
「Quaternion A」を「Quaternion B」で回転させたような挙動が実現できます。
いろいろな関数で様々なQuaternionの生成が行え、そしてそれらが合成できる…
Quaternionが、なかなか魅力的に思えてきませんか?
いろいろなQuaternionを作ろう!
それでは、先ほど見た「Quaternion.Euler関数」をはじめとする、Quaternionの作り方を見ていきましょう。
各軸の角度でQuaternionを作る!
Quaternion rot = Quaternion.Euler(0f, 0f, 1.0f);
これは先ほど使いましたね!
引数に「x軸の回転角度」「y軸の回転角度」「z軸の回転角度」を送ることで、Quaternionを作成することができます。
作ったQuaternionはそのままオブジェクトへ設定したり、現在の回転量と合成したりして使用するわけです。
軸と角度を指定してQuaternionを作ろう!
Quaternion rot = Quaternion.AngleAxis(10.0f, new Vector3(0.0f,0.0f,1.0f));
AngleAxis関数は、第一引数に回転角度を、第二引数に回転の軸を使用します。
今回の例では、Z軸正面を軸に、10度回転させているQuaternionを生成しています。
この関数の、好きな軸を指定できるのは、大きな魅力です。
例えばドリルのように正面に向かい、オブジェクトをぐるぐる回転させたかったとしましょう。
オブジェクトの向いている方向は、Transform.forwardで取ることが可能です。
つまり第二引数にTransform.forwardを設定することで、簡単にそれが実現可能なんです。
フライトシミュレーションの、飛行機のロールもこれなら簡単に行えますね!
回転していないQuaternionを作る!
何も回転していないQuaternionを作りたいときはidentityを使いましょう。
Quaternion rot = Quaternion.identity;
まず無回転のQuaternionを作って、そこから編集をかけていくなどと言った使い道があります。
まとめ
いかがでしたでしょうか?
少し難しい項目ではありますが、作品を作る上で回転は手放せない技術です。
引き続きいろいろと試しつつ、Quaternionを学んでみてください!