座標系のオイラー角姿勢制御
これまで扱ってきた座標系の回転や自転は、 現在の座標系の姿勢を基準に、 追加的に回転する方法でした。しかし場合によっては、 座標系の姿勢を直接的に制御したい場合もあります。 ここでは、そのような座標系の姿勢制御について扱います。
スポンサーリンク
オイラー角
Z-X-Z系オイラー角
3次元座標系の姿勢を表現するには、オイラー角の概念が必要です。 オイラー角は、座標系の姿勢を3つの特別な角度で表現する方法です。 オイラー角の扱いや解釈に関しては、分野や書籍によって様々なものがありますが、 ここでは工学分野などで一般的なZ-X-Z系オイラー角について解説します。
オイラー角で用いる3つの角度を、 それぞれα、β、γとします。 このとき、Z-X-Z系オイラー角では、 座標系の姿勢は次のようにして決定されます:
- 最初に、座標系をZ軸のまわりにαだけ自転させます。
- 続いて、X軸のまわりにβだけ自転させます。
- 最後に、またZ軸のまわりにγだけ自転させます。
これで座標系の姿勢が決まります。
オイラー角の弱点
α、β、γの値を決定すると、座標系の姿勢はただ一通りに定まります。 しかし、必ずしもその逆は言えない事に注意が必要です。 つまりある座標系の姿勢に対して、 対応するα、β、γの組が無数に存在する場合があります。 つまりオイラー角にとっては苦手な姿勢というものが存在し、 それがしばしば思わぬ不具合の原因となってしまう場合があります。 例えば非常に有名な問題として、ジンバルロックというものが知られています。
こうした弱点を回避するためには、 オイラー角のみを使用するのでは無く、 適材適所でrotCoordinate関数やspinCoordinate関数など、 任意軸まわりの回転を使用する事が有効です。
座標系の姿勢制御
オイラー角による姿勢の指定
座標系の姿勢をオイラー角で指定するには、 setCoordinateAngle関数を使用します。
- 関数仕様 -
int coordinateID,
float alpha, float beta, float gamma
)
最初の引数coordinateIDでは、設定対象の座標系のIDを指定します。 続く引数alphaでZ-X-Z系オイラー角の第一角を、 同様にalphaで第二角を、gammaで第三角を指定します。
オイラー角の取得
座標系の姿勢からオイラー角を取得するには、 getCoordinateAngle、getCoordinateAngle、getCoordinateAngle 関数を使用します。
- 関数仕様 -
この関数は、座標系のZ-X-Z系オイラー角を配列で返します。 配列には [0] に第一角α、[1] に第二角β、[2] に第三角γが格納されています。 引数coordinateIDには、取得対象の座標系のIDを指定します。
なお、上でも述べた通り、同じ姿勢を現すオイラー角の組は複数存在します。 この関数は、あくまでその組の内のどれかを返すという事に注意する必要があります。
プログラム例
実際にローカル座標系をワールド座標系の上に配置し、 こまのようにアニメーション的に回転させてみましょう。 区別しやすくするために、 ローカル座標系には小さめの座標軸モデルを、 ワールド座標系には大きめの座標軸モデルを配置します。
このプログラムを実行すると、黒い画面に座標軸モデルが表示されます。 座標軸モデルは大きいものがワールド座標系の上に、小さいものがローカル座標系の上に配置されています。
ローカル座標系は、止まりかけのこまのような、複雑な動きをします。 Z軸をゆっくりと公転させているのが第一角αの効果、Z軸をゆらゆらと振動させているのが第二角βの効果、 座標系を高速にスピンさせているのが第三角γの効果です。