ベクトル、頂点、クォータニオン
ベクトル、頂点、クォータニオン
Microsoft® Direct3D® では、頂点によって位置と向きが表される。プリミティブの各頂点は、位置を示すベクトル、色、テクスチャ座標、姿勢を示す法線ベクトルによって記述される。
クォータニオンは、3 成分ベクトルを定義する [x, y, z] 値に第 4 の成分を追加する。クォータニオンは、3D 回転で一般的に使われる行列手法に代わるものである。クォータニオンは、3D 空間内の軸と、その軸を中心とする回転を表す。たとえば、1 つのクォータニオンで軸 (1,1,2) と 1 ラジアンの回転を表すことができる。クォータニオンは重要な情報も伝えるが、その真価は、クォータニオン上で実行できる 2 つの処理、合成と補間で発揮される。
クォータニオンの合成は、行列の結合処理に類似している。2 つのクォータニオンの合成は、以下のように説明できる。
1 つのジオメトリに対する 2 つのクォータニオンの合成とは、「ジオメトリを axis2 を中心に rotation2 だけ回転した後に、axis1 を中心に rotation1 だけ回転する」ことである。この場合 Q は、ジオメトリに q2 を適用した後に q1 を適用した結果と同じ回転を、単一軸を中心とする回転によって表す。
クォータニオンの補間を使えば、アプリケーションはある軸と姿勢から別の軸と方向までの滑らかで適切なパスを計算することができる。したがって、q1 から q2 の間を補間すれば、ある姿勢から別の姿勢へ簡単にアニメーションすることができる。
合成と補間を組み合わせると、ジオメトリの一見複雑そうな操作を簡単に実行できる。たとえば、一定の向きに回転させたいジオメトリがあるとする。axis2 を中心に r2 度だけ回転した後に、axis1 を中心に r1 度だけ回転することはわかっているが、最終的なクォータニオンはわからないとする。この場合、合成によってジオメトリ上の 2 つの回転を結合すれば、その結果として、単一のクォータニオンが生成される。そして、元のクォータニオンと合成されたクォータニオンの間を補間すれば、クォータニオンからクォータニオンへ滑らかな移行を実現できる。
Direct3D エクステンション (D3DX) ユーティリティ ライブラリには、クォータニオンの操作に役立つ関数がある。たとえば、D3DXQuaternionRotationAxis 関数は、回転の軸を定義するベクトルに回転値を加算し、その結果を D3DXQUATERNION 構造体によって定義されるクォータニオンに返す。さらに、D3DXQuaternionMultiply 関数はクォータニオンを合成し、D3DXQuaternionSlerp は 2 つのクォータニオン間で球面線形補間を実行する。
Direct3D アプリケーションでは、以下の関数を使ってクォータニオンの操作を単純化できる。
- D3DXQuaternionBaryCentric
- D3DXQuaternionConjugate
- D3DXQuaternionDot
- D3DXQuaternionExp
- D3DXQuaternionIdentity
- D3DXQuaternionInverse
- D3DXQuaternionIsIdentity
- D3DXQuaternionLength
- D3DXQuaternionLengthSq
- D3DXQuaternionLn
- D3DXQuaternionMultiply
- D3DXQuaternionNormalize
- D3DXQuaternionRotationAxis
- D3DXQuaternionRotationMatrix
- D3DXQuaternionRotationYawPitchRoll
- D3DXQuaternionSlerp
- D3DXQuaternionSquad
- D3DXQuaternionToAxisAngle
Direct3D アプリケーションでは、以下の関数を使って 3 成分ベクトルの操作を単純化することができる。
- D3DXVec3Add
- D3DXVec3BaryCentric
- D3DXVec3CatmullRom
- D3DXVec3Cross
- D3DXVec3Dot
- D3DXVec3Hermite
- D3DXVec3Length
- D3DXVec3LengthSq
- D3DXVec3Lerp
- D3DXVec3Maximize
- D3DXVec3Minimize
- D3DXVec3Normalize
- D3DXVec3Project
- D3DXVec3Scale
- D3DXVec3Subtract
- D3DXVec3Transform
- D3DXVec3TransformCoord
- D3DXVec3TransformNormal
- D3DXVec3Unproject
その他、D3DX ユーティリティ ライブラリの算術関数には、2 成分ベクトルや 4 成分ベクトルによる処理を単純化するための関数が、多数用意されている。