座標系を回転させるのに、これまでは rot メソッドや spin メソッドを使用してきました。ここではもう一つの角度指定方法である、オイラー角指定について解説します。
オイラー角による姿勢制御には、簡単に使用できる rot メソッドとは違い、やや学術的な知識が必要とされます。また、場合によっては姿勢制御が不能になる「ジンバルロック」の問題も存在するため、設計段階からの慎重な対応が要求されます。
■ オイラー角
・rot メソッドや spin メソッドは追加回転
これまでにも既に、座標系を回転させる方法として rot メソッドや spin メソッドを扱いましたが、これらのメソッドは現在の角度から追加回転させるための機能でした。これらのメソッドは座標軸まわりの回転や任意軸まわりの回転など、非常に強力な回転操作を扱えて便利ですが、そもそもが追加回転であるために、何回も繰り返して用いると現在の座標系の角度の把握が困難になります。従ってある時に、ある決まった角度に、座標系を完全に正確に向かせたい場合などには不向きと言えます。
・オイラー角
そこで座標系の角度を正確に指定する方法があるのですが、そのための前提知識として必要なのが、オイラー角の概念です。オイラー角は、座標系の絶対的な向きを、3つの角度で表現するための、一般的な表記法です。3Dプログラミングの世界でも使用されますし、学問分野では物理学・工学などで登場します。
オイラー角の3つの角度の名称は、分野ごとにかなり異なりますが、例えば物理学分野ではそれぞれ頂角(天頂角)、座角(方位角)、回転角などと呼ばれたりします。物理学分野では慣習的に頂角(天頂角)はθ(シータ)、座角はφ(ファイ)、回転角はλ(ラムダ)といったギリシャ文字を用いて表現されます。
■ オイラー角の成分
・頂角(天頂角)θ
頂角(天頂角)は、基準となる座標系(ここでは親座標系)から見て、Z軸が傾いている角度を表します。この角度はX軸とY軸の角度によらず、Z軸の角度のみで決まる量です。3つの角度が全て
0 の状態から頂角のみを増やすと、Z軸は、X軸を回転軸として倒れていきます。RINEARN
3Dでは、倒れる方向をX軸の正の方向へ右ねじをねじ込む回転方向としています。
・座角(方位角)φ
座角(方位角)は、Z軸が、基準となる座標系(ここでは親座標系)のZ軸を回転軸として、どれだけ回転した位置にあるかを表す角度です。
・回転角λ
回転角は、X軸とY軸が、自分のZ軸を回転軸として、どれだけ回転した位置にあるかを表す角度です。
原理的には、座標系のどのような姿勢も、ある基準座標系からのオイラー角で表現する事ができるはずです(それを求める計算は若干ややこしいですが)。ただし、オイラー角と姿勢は必ずしも一対一対応では無い事に留意しておいてください。
つまり、あるオイラー角を与えると座標系の姿勢は必ず一つに定まりますが、その座標系の姿勢に対応するオイラー角は複数ある場合があります。例えば頂角θが0の場合を考えてみましょう。この場合、座角φも回転角λも、共にZ軸まわりの回転となってしまいます。従って、(θ,φ,λ)
= (0,1,0) と (0,0,1) は明らかに同じ姿勢を示します。
つまり、座標系の姿勢からオイラー角を求めたい場合、それは必ずしも唯一つには定まらないという事が言えるのです。用途によっては、この事が厄介な現象を引き起こす場合があります。オイラー角にはこのような弱点が存在するため、分野によってはクォータニオンと呼ばれるより高度な回転演算が使用される事があるほどです。従って、オイラー角度を利用する場合は、厄介な現象が発生する場合があるという事を予め知った上で、的確に使用する必要があります。
■ オイラー角の設定
・頂角θの設定
頂角の設定には、CoordinateSystem3DEG クラスの setTheta メソッドを使用します。引数には頂角を
double 値で指定します。
・座角φの設定
座角φの設定には、CoordinateSystem3DEG クラスの setPhi メソッドを使用します。引数には座角を
double 値で指定します。
・回転角λの設定
回転角の設定には、CoordinateSystem3DEG クラスの setLambda メソッドを使用します。引数には座角を
double 値で指定します。
・3つの角度変数を一度に指定する
上記のようにそれぞれの角度を独立に設定する方法の他にも、CoordinateSystem3DEG
クラスの setAngle メソッドを使用すると、オイラー角の3つの角度を一度に指定することができて便利です。
setAngle( double 頂角θ, double 座角φ, double 回転角λ ) |
■ オイラー角の取得
rot メソッドや spin メソッドなどを複雑に組み合わせて使用した場合などで、プログラマにとって座標系の角度把握や制御が困難になる場合があるかもしれません。そのような場合、座標系のオイラー角の値を取得することができます。それには
CoordinateSystem3DEG クラスの getTheta、getPhi、getLambda メソッドを使用します。これらのメソッドは、それぞれ頂角、座角、回転角を
double 値で返します。
頂角θの取得:
getTheta( )
座角φの取得:
getPhi( )
回転角λの取得:
getLambda( ) |