同次変換の利用と3次元

Last update: <2004/03/13 17:31:20 +0900>

行列計算の基礎

オブジェクトの位置や姿勢を3次元的に定義するためには行列が便利です. OpenGLではオブジェクトの移動や回転で行列の概念を利用しています.OpenGLをVRに用いる場合には,視点やオブジェクトの座標変換が不可欠であるといってよいでしょう. ここでは行列の計算とOpenGLの関わりについて説明します*9

OpenGLでは右手系の空間座標系を利用していることは前回に述べた通りです.空間座標系とは(x,y,z)の3次元で張られた座標系です.この空間座標系に物体を描画したり,動作させたりするわけですが,最も基準となる座標系のことをワールド座標系と呼びます.

物体(オブジェクト)を配置する最も簡単な方法は,ワールド座標系での座標値を指定して,その位置に物体の点やポリゴンを表示させることです.しかし,点やポリゴンを動かしてアニメーションをする場合,動きより新しい座標値を毎回計算し,更新しなければなりません.これはとても面倒なことです.(下図の右)


図:ワールド座標系とモデル座標系

そこでOpenGLでは座標変換という概念を使います.上の図にあるように,モデル座標系という座標系を用意して,その座標系で物体の座標値を指定しておき,モデル座標系を丸ごと動かす(座標変換する)ことによって,容易に物体の操作を行うことができます.

座標変換操作を数学的にあらわすには,同次変換行列が強力です.次節より同次変換行列を使用した座標変換について述べていきます.

同次変換行列


同次変換行列は同次変換行列は4×4の行列で,一般にロボットアームの位置姿勢を表現するのに用いられています.ここでは簡単に行列について説明しますが,詳しくはロボット工学の授業を参考にして下さい.

そもそも座標変換というのは,ある座標系から他の座標系に射影される関係のことを表しています.例えば下の図の例では,モデル座標系で単位立方体の座標値が指定されています.(1,0,0),(1,0,1),(0,0,1),...という数字です.この座標値はモデル座標系でしか通用しません.ワールド座標系で通用させるためには,ワールド座標系から見たモデル座標系の位置関係が必要となります.ワールド座標系からみて,モデル座標系がx軸に100ずれている場合だと,単位立方体の位置はワールド座標系で(101,0.0),(101,0,1),(100,0,1),...となります.

ここでは単なる足し算ですが,この変換操作を座標変換といいます.同次変換行列を使うと次のようにあらわすことができます.
x_m,y_m,z_mがモデル座標系のローカルの位置,x_w,y_w,z_wがワールド座標系での位置になります. 真ん中の4×4の行列が同次変換行列で,ワールド座標系から見てモデル座標系が100ずれていることを意味しています.つまり,この行列はワールド座標系からモデル座標系にx軸方向に+100ずらすという性質を持っています.ただし,座標値の計算はモデル座標ローカル値より,ワールド値に変換していることに注意して下さい.

この同次変換行列を使った基本操作を列挙しておきます.

同次座標行列の逐次変換

同次変換行列を逐次掛け合わせることによって,より高度な座標変換をおこなうことができます.

例えば,太陽の周りを地球が公転していて,地球の周りを月が公転しているシーンを想像して下さい.太陽を描画するためには,太陽の位置に座標変換します.さらに地球は太陽を基準に公転するので,太陽の座標系からさらに座標変換します.月は地球を中心に回転しますので,同様に地球の座標系から逐次座標変換することになります.

このように平行移動,回転移動などの同次変換行列を組みあわせることによって,より複雑なモデルの記述を行うことができます.

ただし,逐次変換における変換の順序は非常に重要です.行列の乗算では交換法則が成立しないため,変換順序を間違えると座標系がおかしくなります.ここでは変換の順序が座標系にどう影響するか,具体的に述べます.



変換の順序でも混乱を招きやすいのが,回転と移動の混在です.例として次のような変換を考えます.

変換1は,座標系をx軸正方向に+aだけ平行移動します.また変換2は座標系をz軸まわりに α度回転します.
変換1と変換2の順序を違えた場合,座標系はどのように変換されるか見てみましょう.

とします.T1は平行移動の後,回転をします.T_2は回転の後,平行移動します.具体的な計算をすると,


T1の回転成分とT2の回転成分は同じものとなっていますが,平行移動成分は異なっています.これを図に表わすと下図のようになります. 左側がT1による座標変換,右側がT2による変換です.平行移動と回転の順番が異なるだけで,このように座標系は大きく変わってきます.


実際のプログラムを記述する上では,座標系の変換順序が間違っていてもエラーにはならないため,誤りを発見しづらいハマりどころでもあります.十分注意しましょう.

同次座標変換例

同次変換行列の逐次変換をもちいた具体的な例として,本節では惑星の挙動を題材にして説明します.太陽と地球,月の位置姿勢を同次変換行列を用いて表わそうというものです.


それぞれの位置関係を上の図のようにとります.太陽の座標系をワールド座標系Wとして,地球座標系E,月座標系Mを決めます. 地球は太陽のまわりを半径Reの円軌道を描いて回転するものとします.また基準からの回転角度をθekとし,回転軸をzとします.

このとき,ワールド座標系Wから地球座標系Eへの変換は,

と表わせます. 月は地球のまわりを半径Rmの円軌道を描いて回転するものとします.基準からの回転角度をθmkとし,回転軸をzとします.

このとき,地球座標系Eから月座標系Eへの変換は,

したがって,ワールド座標系Wから月座標系Mへの変換は,

となります.

演習


自習問題

  1. glutSolidSphere()の代わりにglutSolidTeapot(float size)を使ってみましょう.
  2. ここで勉強したOpenGLの関数は,
    です.赤本を利用して,復習しておきましょう.

戻る