座標系のオイラー角指定
< 前へ [ トップへ ] 次へ >

 座標系を回転させるのに、これまでは 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 値で指定します。

setTheta( double 頂角θ )

・座角φの設定
 座角φの設定には、CoordinateSystem3DEG クラスの setPhi メソッドを使用します。引数には座角を double 値で指定します。

setPhi( double 座角φ )

・回転角λの設定
 回転角の設定には、CoordinateSystem3DEG クラスの setLambda メソッドを使用します。引数には座角を double 値で指定します。

setLambda( double 回転角λ )

・3つの角度変数を一度に指定する
 上記のようにそれぞれの角度を独立に設定する方法の他にも、CoordinateSystem3DEG クラスの setAngle メソッドを使用すると、オイラー角の3つの角度を一度に指定することができて便利です。

setAngle( double 頂角θ, double 座角φ, double 回転角λ )



 オイラー角の取得

 rot メソッドや spin メソッドなどを複雑に組み合わせて使用した場合などで、プログラマにとって座標系の角度把握や制御が困難になる場合があるかもしれません。そのような場合、座標系のオイラー角の値を取得することができます。それには CoordinateSystem3DEG クラスの getTheta、getPhi、getLambda メソッドを使用します。これらのメソッドは、それぞれ頂角、座角、回転角を double 値で返します。


頂角θの取得:
getTheta( )

座角φの取得:

getPhi( )

回転角λの取得:

getLambda( )
< 前へ [ トップへ ] 次へ >


スポンサーリンク



スポンサーリンク

この階層の目次
新しいお知らせ

リニアンプロセッサー nano の先行開発版やソースコードリポジトリを公開
2019年04月16日 - オープンソースで開発中の小型プログラム関数電卓ソフト、「 リニアンプロセッサー nano 」の先行開発版やソースコードリポジトリを公開しました。概要と使用方法、ビルド方法などについて解説します。

各ソフトウェアの最新版を一括でリリース、OpenJDKのJava実行環境(JRE)に対応
2019年03月06日 - RINEARNでは3月6日に、主要なソフトウェアの最新版を一括でリリースしました。今回のアップデートには、以前お知らせした、OpenJDKで生成したJREへの対応が含まれています。その概要等をお知らせします。

次回のVCSSL 3.4.10において、関数1個の挙動に非互換な修正が適用されます
2019年02月12日 - VCSSLの次回の正式リリース版3.4.10において、これまでドキュメントと実際の挙動が異なっていた描画系の関数1個に、非互換な修正が適用されます。その詳細と、使用コードでの対応方法について解説します。

コードアーカイブ新着
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを生成し、3D空間に配置します。
2019年05月21日
[公式ガイドサンプル] ポリゴンを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体の基本的な構成要素となるポリゴンを生成し、3D空間に配置します。
2019年05月20日
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(魔法陣形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、魔法陣のような3次元曲面のグラフを描画します。
2019年05月17日
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(花形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、花の形の3次元曲面のグラフを描画します。
2019年05月16日
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元のメッシュグラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元のメッシュグラフを描画します。
2019年05月16日
公式Twitterアカウント

スポンサーリンク