コンピュータ工学演習 解説と課題 (6)

コンピュータ工学演習 解説と課題 (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列の行列で
り扱うことが出来ないという問題がある.そこで媒介変
∗
大阪大学大学院 基礎工学研究科 システム創成専攻 システム科
学領域 准教授,[email protected]
*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