[ 前へ | 目次 | 次へ ]

座標系のオイラー角姿勢制御

これまで扱ってきた座標系の回転や自転は、 現在の座標系の姿勢を基準に、 追加的に回転する方法でした。しかし場合によっては、 座標系の姿勢を直接的に制御したい場合もあります。 ここでは、そのような座標系の姿勢制御について扱います。


Z-X-Z系オイラー角

Z-X-Z系オイラー角

3次元座標系の姿勢を表現するには、オイラー角の概念が必要です。 オイラー角は、座標系の姿勢を3つの特別な角度で表現する方法です。 オイラー角の扱いや解釈に関しては、分野や書籍によって様々なものがありますが、 ここでは工学分野などで一般的なZ-X-Z系オイラー角について解説します。

オイラー角で用いる3つの角度を、 それぞれα、β、γとします。 このとき、Z-X-Z系オイラー角では、 座標系の姿勢は次のようにして決定されます。 最初に、座標系をZ軸のまわりにαだけ自転させます。 続いて、X軸のまわりにβだけ自転させます。 最後に、またZ軸のまわりにγだけ自転させます。 これで座標系の姿勢が決まります。

オイラー角の弱点

α、β、γの値を決定すると、座標系の姿勢はただ一通りに定まります。 しかし、必ずしもその逆は言えない事に注意が必要です。 つまりある座標系の姿勢に対して、 対応するα、β、γの組が無数に存在する場合があります。 つまりオイラー角にとっては苦手な姿勢というものが存在し、 それがしばしば思わぬ不具合の原因となってしまう場合があります。 例えば非常に有名な問題として、ジンバルロックというものが知られています。

こうした弱点を回避するためには、 オイラー角のみを使用するのでは無く、 適材適所でrotCoordinate関数やspinCoordinate関数など、 任意軸まわりの回転を使用する事が有効です。

座標系の姿勢制御

オイラー角による姿勢の指定

座標系の姿勢をオイラー角で指定するには、 setCoordinateAngle関数を使用します。

- 関数仕様 -

int setCoordinateAngle (
  int coordinateID,
  float alpha, float beta, float gamma
)

最初の引数coordinateIDでは、設定対象の座標系のIDを指定します。 続く引数alphaでZ-X-Z系オイラー角の第一角を、 同様にalphaで第二角を、gammaで第三角を指定します。

オイラー角の取得

座標系の姿勢からオイラー角を取得するには、 getCoordinateAngle、getCoordinateAngle、getCoordinateAngle 関数を使用します。

- 関数仕様 -

float[ ] getCoordinateAngle ( int coordinateID )

この関数は、座標系のZ-X-Z系オイラー角を配列で返します。 配列には [0] に第一角α、[1] に第二角β、[2] に第三角γが格納されています。 引数coordinateIDには、取得対象の座標系のIDを指定します。

なお、上でも述べた通り、同じ姿勢を現すオイラー角の組は複数存在します。 この関数は、あくまでその組の内のどれかを返すという事に注意する必要があります。

プログラム例

実際にローカル座標系をワールド座標系の上に配置し、 こまのようにアニメーション的に回転させてみましょう。 区別しやすくするために、 ローカル座標系には小さめの座標軸モデルを、 ワールド座標系には大きめの座標軸モデルを配置します。

このプログラムを実行すると、黒い画面に座標軸モデルが表示されます。 座標軸モデルは大きいものがワールド座標系の上に、小さいものがローカル座標系の上に配置されています。

実行結果、角度を設定された座標系の図
実行結果
大きな座標軸と小さな座標軸が表示される。小さな座標系は、アニメーションで回転する。

ローカル座標系は、止まりかけのこまのような、複雑な動きをします。 Z軸をゆっくりと公転させているのが第一角αの効果、Z軸をゆらゆらと振動させているのが第二角βの効果、 座標系を高速にスピンさせているのが第三角γの効果です。



スポンサーリンク



スポンサーリンク

この階層の目次
[ 前へ | 目次 | 次へ ]
お知らせ

Vnanoのスクリプトエンジンアーキテクチャ解説1: 全体像
2019年05月28日 - RINEARNでは現在、 アプリケーション組み込み用スクリプトエンジン「 Vnano 」を、オープンソースで開発中です。今回は、このスクリプトエンジンのアーキテクチャ面を掘り下げて解説します。

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

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

新着
連番ファイルから3Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。
2019年06月03日
連番ファイルから2Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。
2019年05月24日
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する

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

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

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、魔法陣のような3次元曲面のグラフを描画します。
2019年05月17日
開発元Twitterアカウント

スポンサーリンク