コンピュータ工学演習 解説と課題 (6) 日浦 慎作∗ あることから,平行移動と一次変換を何度繰り返しても 1 講義内容 一定の計算により合成変換を実現できることがわかる. 第6回の演習では,OpenGL により行われている座 このようにベクトルの末尾に要素を追加することで平 標変換を自前で実装し,どのように3次元世界が2次元 行移動を統合的に扱う変換を同次座標変換といい,コン 画像として描かれるのかを理解することを目標とする. ピュータグラフィックスの他には,コンピュータビジョ ン(画像認識)やロボット工学(ロボットの関節角度と 2 OpenGL における変換 手先の位置・姿勢の関係の計算など)に多用される*2 . 第2回の演習でも説明したように,OpenGL では図 1 に示すような3段階の座標変換が用いられている.こ 2.2 ビューポート変換 れらについて,どのような計算により実現できるかを示 変換である.図 1 に示すように,(−1, −1) から (1, 1) す.またそれに先立ち,平行移動と一次変換を統合的に の範囲の正規化デバイス座標をウィンドウ座標に変換す 扱うことが出来る同次座標変換について述べる. る.ウィンドウの幅と高さをそれぞれ Wx , Wy とする 2.1 同次座標変換 と,ウィンドウ座標は,左上が (0, 0) で右下が (Wx , Wy ) ビューポート変換は,2次元平面から2次元平面への 一次変換は座標の回転や拡大縮小を統合的に扱うこと であるので,ビューポート変換を行う同時座標変換行列 が出来る変換であり,コンピュータグラフィックスにお は以下のようになる. ける物体の変形や配置などに便利である.しかし原点は 常に原点へ変換されるため,平行移動を取り扱うことが 0 0 出来ない.そこで一般に,一次変換と平行移動の組み合 *1 わせ(アフィン変換 )が用いられる.2次元平面上の アフィン変換は以下のような式で表される. [ x2 y2 ] [ = r11 r21 r12 r22 ][ x y ] [ + tx ty 2.3 ] (1) r12 r22 0 透視変換 Xc x=fZ c Y y=f c Zc tx x ty y 1 1 (3) 1 係は以下の式で表される. うに3行3列の行列の積で表すことが出来る. r11 x2 y2 = r21 1 0 0 視点座標系における点と正規化デバイス座標上の像の関 たものを考える.すると,式 (1) と同じ変換を以下のよ Wy 2 を通る.図のように視点座標 (Xc , Yc , Zc ) を定めると, それぞれのベクトルの末尾に値が1の要素を1つ追加し − る画像上の1点を直線で結ぶと,その点はレンズの中心 一次変換に比べるとやや取り扱いが面倒である.そこで Wx 2 Wy 2 0 図 1 に示すように,実世界中の1点と,それに対応す しかしこの変換は2つの項に分かれているため,単純な Wx 2 (2) (4) ただし,この式中の定数 f は焦点距離といい,画角を表 す.つまり f が大きいと望遠レンズとなり写る範囲が この式を p ⃗2 = F p⃗ と置くことにする.また,さらに p⃗2 狭くなる(遠くのものが大きく写る).逆に f が小さい から p ⃗3 への変換が p⃗3 = G⃗ p2 と表されるとする.こ と広角レンズとなる. のとき,これらの合成変換は行列 F と G の積により, この式は除算が含まれ,行列演算などの線形演算で取 p⃗3 = G · F p⃗ と表され,G · F もまた3行3列の行列で り扱うことが出来ないという問題がある.そこで媒介変 ∗ 大阪大学大学院 基礎工学研究科 システム創成専攻 システム科 学領域 准教授,shinsaku@sys.es.osaka-u.ac.jp *1 直線上の等間隔な点は変換後も直線上で等間隔に並び,また, 平行線は変換後も平行になるような変換. *2 1 電子システム学コースでは,3年次前期の講義「ロボット工学 A」で学習する.また3年次後期の学生実験Bのテーマ「距離 計測」「ロボットアーム」でも実習する. ウィンドウ座標 正規化デバイス座標 視点座標 Yc y xs 世界座標 Zw (1,1) Zc ys レンズ x (-1,-1) ビューポート変換 Xc 透視変換 Yw Xw モデルビュー変換 図 1 OpenGL で用いられる座標系 数 h を用い,式 (4) を次のように表す. x f h y = 0 1 0 0 f 0 新たな変換を表す行列が掛け合わされることになる.ま X 0 0 c Yc 0 0 Zc 1 0 1 た glPushMatrix, glPopMatrix などはモデルビュー 変換行列を一時的に保存する役目を果たす.グラフィッ (5) クス描画ハードウェアには,様々な関数で指定した全て の変換が合成された結果のモデルビュー変換行列が1個 だけ設定され,これにより座標変換が行われるので,そ この3行4列の行列を透視変換行列と呼ぶ. れまでにいくつ座標変換を行ったかにかかわらず変換に この式の意味は,つぎのように考えると理解しやす 要する計算時間は変化しない. い.まず,式 (4) を分母と分子に分けて考え,割り算だ けは最後までやらずにおくことを考える.すると式 (4) 3 演習課題 の分子はそれぞれ f Xc , f Yc となり,分母は Zc で共通 以下の課題についてプログラムを作成し,そのソース である.これを順に式 (5) の第1行目から第3行目と見 コードを提出するとともに,課題3で描いた画像のスク なす.また左辺はそれぞれ hx, hy, h である.これらの リーンショット(画面のハードコピー)を添付せよ. 3つの値から x の値を求めるには,hx h ,すなわち第1行 の計算結果を第3行の計算結果で割ればいい(これが, • 課題1:ウィンドウの幅と高さ,カメラの焦点距離 分数の分母と分子の除算を実際に行うことに相当する) . を指定すると,ビューポート変換と透視変換の行列 この割り算をやらずに延期しておくのが透視変換の行列 を計算するプログラムと,その変換を行う関数を作 表現のミソである. 成せよ. 2.4 モデルビュー変換 • 課題2:X 軸まわりの回転角と平行移動量を指定 モデルビュー変換は,アフィン変換,すなわち一次変 するとモデルビュー変換行列を作成するプログラム 換と平行移動の組み合わせにより表現できる.これは同 と,その変換を行う関数を作成せよ. 次座標変換を用いることで,4行4列の行列によって表 • 課題3:課題1と課題2で作成した関数と,前回の される.以下の式で r11 から r33 までの9個のパラメー 演習で作成した自前の直線描画プログラムを組み合 タは一次変換を表し,また tx , ty , tz は平行移動を表す. わせ,3次元空間中で定義された直線を2次元空間 r11 r21 r31 0 r12 r22 r32 0 r13 r23 r33 0 tx ty tz 1 へ変換して描画し,これにより立体的な物体(円柱, 球,グラフなど何でもよい)を描画するプログラム (6) を作成せよ(前回の課題がどうしても出来ていない 人は,第1回の演習で用いた直線を描画するプログ ラムを元にしてもよい). 2回目の演習で述べたように,OpenGL ではモデリ ング変換と視点の変換(カメラの位置・姿勢)がモデル ビュー変換として合成され,統合的に扱われている.こ の合成変換のうち,透視変換行列に近い側(左よりの行 列)が視点の変換となる.glRotated や glTranslated などの関数を呼び出すと変換が追加される(合成され る)が,これは,既存のモデルビュー変換行列の右側から 2
© Copyright 2024 Paperzz