[ 前へ | 目次 | 次へ ]

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

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

スポンサーリンク


オイラー角

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軸をゆらゆらと振動させているのが第二角βの効果、 座標系を高速にスピンさせているのが第三角γの効果です。



スポンサーリンク



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

リニアングラフ3Dをアップデート、次期版(Ver.6)の開発もスタート
2023/09/04 - リニアングラフ3Dのアップデート版をリリースしました。また、次期メジャーバージョンである Ver.6 系の開発も開始しました。それぞれについて解説します。

AIの補助により、英語版ドキュメントを大幅拡充へ - 作業の舞台裏も紹介!
2023/05/28 - RINEARNでは今後、ChatGPT等のAIの補助により、英語版ドキュメントを大幅に拡充していく方針です。既に行った英訳作業の様子なども紹介しつつ、詳しく解説します。

リニアングラフ3Dをアップデート、API関連機能などを拡充
2023/05/18 - リニアングラフ3Dのアップデート版をリリースしました。主に、Java言語やVCSSLでの制御機能などを拡充しました。更新内容をそれぞれ詳しく解説します。

新着
[公式ガイドサンプル] 各種の図形や画像を描画する

「VCSSL 2DCG開発ガイド」内のサンプルコードです。図形や画像などを描画します。
2022/12/16
角度の「度」とラジアンとを相互変換し、図示もするツール

45度などの「度」の値と、ラジアンの値とを相互に変換できるツールです。対応する角度の図示もできます。
2022/11/22
[公式ガイドサンプル] 立体モデルを回転させるアニメーション

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、アニメーションで回転させ続けます
2022/11/18
[公式ガイドサンプル] 立体モデルを回転させる

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、指定した角度だけ回転させます。
2022/11/17
[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

「VCSSLスタートアップガイド」内のサンプルコードです。四則演算が計算される順序や、カッコを使って順序を指定する方法を例示します。
2022/10/31