- クオータニオンを使う - |
3Dアニメーションには欠かせないクォータニオンを使いましょう、というコーナーです。 ここでは「使う」ことを中心としますのでクォータニオンについての詳細は詳しいHPや書籍などを参照してください。 また、四則演算はC言語での表記になってますのでご注意を。 ・クォータニオンとは? (t; x, y, z)のように表します。tは実部(実数)、そのほかは虚部(虚数)といいます。 これがクォータニオンと呼ばれるものです。 また、3次元空間の座標をクォータニオンで表すと、 (0; x, y, z) となります。 ・クォータニオンの掛け算 以下の2つのクォータニオンの掛け算をします。 Q1 = (t1; x1, y1, z1) = (t1; V1) 虚部はベクトルとして考えます。このクォータニオン掛け算は、 Q1 * Q2 = (t1t2 - V1・V2; t1V2 + t2V1 + V1×V2) となるみたいです。(「・」は内積、「×」は外積) また、基本的には「Q1Q2≠Q2Q1」のようですので掛ける方向に注意してください。 ・クォータニオンを使った回転 クォータニオンの掛け算さえできれば回転は簡単にできます。 回転させたい点を、 Q = (0; qx, qy, qz) とおきます。 次に回転軸の方向を決めるベクトルを Vr = (xr, yr, zr) (|Vr| = 1) とします。 Qを回転させるクォータニオンを作成します。θは回転角度です。 A = (cos(θ/2); xr * sin(θ/2), yr * sin(θ/2), zr * sin(θ/2)) この2つのクォータニオンを作成したら、 B * Q * A = (0; x, y, z) という計算をします。 実部を抜いた(x, y, z)がVrを軸としてQをθ度回転した点になります。 以下はクォータニオンで回転をさせる関数のサンプルです。 筆者はOpenGL+WGLで使ってまして、C言語チックなC++言語で書いてます。 ・クォータニオンを使って点の回転をするサンプルソース #define PI 3.141592653589793 //Vector構造体 struct Vector { float x;}; //Quaternion構造体 struct Quaternion { float t;}; //クォータニオン(quaternion)の掛け算a*b Quaternion MultiplyQuaternion(Quaternion a, Quaternion b) { Quaternion ans; //クォータニオンの掛け算の結果} //axisVectorを軸にしてpointをangle度回転させる Vector RotateByQuaternion(Vector point, Vector axisVector, int angle) { Quaternion calcA, calcB; //軸ベクトルから計算されるクォータニオン } ベクトルの正規化の関数は省略。 MultiplyQuaternion()がごちゃごちゃしていますが、これは先ほど出てきた Q1 * Q2 = (t1t2 - V1・V2; t1V2 + t2V1 + V1×V2)を展開しているだけです。 実際に計算してみるとソースのような式が得られます。 また、上記の処理をあるオブジェクト(OBJファイル等で書かれたもの)のすべての頂点に適用すれば、 オブジェクト自体を回転させる事ができます。 |