2000年4月22日更新(新規に追加)  関谷トップページへ CGトップページへ   作者へのメッセージ

図形処理・計算処理実習No.3 Glibwv.hを使ったグラフィックス(2) 3次元座標変換

2000.4.26 KPC 情報技術科  関谷

0. 前回のレポートを見てのコメント、色の反転

作図プログラムやデータの説明を付けること。

 レポートには、結果の図をどのように作図したかを説明して欲しい。(プログラム名やその内容、実行でのデータなどです。前回のプログラムについては、プログラム名やパラメータを図の上部に表示するように変更したので、再度、コピーして実行してみること。)

色の反転について

 Wordなどに直接に画面のPrintScreen(クリップボード)を貼り付けると、印刷時に背景が真っ黒になってしまう。描画した線などが分かりにくい。 そのため、一度ペイントに貼り付けた後で、色の反転をしてそれを再度コピーして、Wordに貼り付けることをした。
 しかし、これは面倒である。slsの長方形を排他的論理和で塗りつぶす関数rectfillXOR()を最後に呼べば、色の反転をすることが出来る。そこで、ファイル・サーバのslsを使ったC言語のプログラムは、すべて、この方法に変更したものをコピーしている。

 

1. 2次元座標変換、Glibwv.hとそのビューポート座標系についての補足

2次元座標変換式をベクトルで考える

 2次元座標変換(対称移動、平行移動、回転移動、拡大・縮小)式は、河西の8.2節に解説がある。
 これらの変換式については、変換前のある点(x0,y0)を原点からのベクトルの成分表示と考えると、変換後の成分(x、y)は、前のそれぞれの成分ごとの回転による座標を加えることで求まる。これは、三角関数の加法定理を使うものよりも分かりやすい。なお、2Dでの回転は、3Dでのz軸回りの回転に相当する。

2次元座標変換の実装方法-自作かグラフィックライブラリを使うか

 2次元座標変換は、Glibwv.hをもとに、河西の8.2節-C言語での関数mirror(),rotate(),multi()などを自作する-で実現できた。
これに対して、Java2Dでは、AffineTransformクラスとして、準備されており、単にそれらのメソッドを指定するだけで使えるようになっている。 (中山茂著、Java2グラフィックスプログラミング入門、技術評論社、1999.3、pp.228-236)

Glibwv.hでのビューポート座標系

 小生の移植では、図8.4での仮想物理座標系(原点をスクリーン左下)を使わず、原点は左上隅として、ビューポートの左下隅と右上隅を指定するようにしている。

ビューポートの効果と自作関数

 ビューポートを変えることで、同じ図形データでの描画処理をしても、表示される大きさを変えることが出来る。(例題57での実行例を参照のこと。)今回の3次元処理での例のように、違った処理結果の表示も並べて表示できる。
 このように、Glibwv.h自体が、2次元座標変換を利用している。これらの自作関数を準備しておけば、それを使うことで、図形処理が相当に便利になる。

2.3次元座標変換

 3次元空間にある物体を紙やCRTという2次元平面に作画するには、透視図法や軸測投影などを使う。

2.1 軸測投影(平行光線によるx-y平面への投影)

1)立体をx、y、z軸回りに回転変換する。

 回転角の正方向は、各軸の正方向に向かって右ねじを回す向きとし、x軸、y軸、z軸回りの回転角をそれぞれ、α、β、γとする。回転の順序をy軸→x軸→z軸の順に行うものとすると、点(x、y、z)は、次のように変換される。
(これも、3次元空間のベクトルの成分表示と考えて、それぞれの成分の計算を加えることで求まる。) 

 y軸回りにβ回転 ->
  x1=xcos(β)+zsin(β) 
  y1=y
  z1=−xsin(β)+zcos(β)
 
 x軸回りにα回転 ->
  x2=x1
  y2=y1cos(α)−z1sin(α) 
  z2=y1sin(α)+z1cos(α)

 z軸回りにγ回転 ->
  x3=x2cos(γ)−y2sin(γ) 
  y3=x2sin(γ)+y2cos(γ)
  z3=z2

2)上の回転で得られた座標をz=0(x−y平面)に平行投影する。

 これは、上の結果の(x3、y3、z3)のうち、z3を無視すること。
 したがって、上の示した式のz2、z3は不用となる。

例題59 家のデータを軸測投影で表示するプログラム

 家のデータは、構造体配列に格納している。
 3つの回転量は、角度でキーインする。
 3種のパラメータの投影図を、スクリーンでは、横に並べて表示する。

例題59 家のデータを軸測投影で表示(3 View)
この一番右の図では、家を床下から見ているのであるが、最初は、そのようには見えないであろう。ワイヤーフレーム表示でなく、光を当てて、壁面を考慮した陰線消去などをしないと、なかなかに、正確には見れないことが分かる。

2.2 透視変換

 軸測投影では、投影面に対し平行光線を当てて投影した。透視では、ある点に向かって収束する光を当てる。この点を投影中心(消失点)と呼び、z軸上にとることにする。これの絶対値が大きければ、遠近感が小さくなる。
逆に、立体に近ければ、遠近感が強調される。
 透視では、投影中心に対する立体の位置が異なると、立体の見え方が変わる。立体が投影中心より上方にあれば、立体を見上げるように透視される。
 透視では、立体の回転に加え、平行移動の操作が加わる。
 
 y軸回りのβ回転と、x、y、z方向の平行移動量をl、m、nとし、投影中心をz=−vpとする。また,変換後の点は、z=0平面(x−y平面)に透視するものとする。
 変換式は、つぎのようになる。
まず、回転と平行移動により、
  x1=xcos(β) + zsin(β) +l
  y1=y+m
	z1=−xsin(β) + zcos(β) +n
が得られ、これをz=0平面に透視すると、つぎのようになる。
  px=x1/h
  py=y1/h
   ただし、h=(z1+vp )/ vp
        =−xsin(β)/vp+zcos(β)/vp+n/vp+1.0
この透視は2点透視といわれ、最も使われる方法である。β=0のときは単点透視となる。

練習問題59 透視プログラム

 例題59と同じ家のデータがあったとき、これを透視で表示する。  y軸回りの回転量β、消失点距離vp、x、y、z軸方向の移動量l、m、nは、キーインする。  3組をスクリーンでは、横に並べて表示する。

練習問題59 家のデータを透視で表示(3 View)

2.3 投影、透視のプログラムの解析と改造など

例題を参考に、皆さんの描きたい図形データなどを用意して、プログラムを改造し、作品を作りなさい。

2.4 レポートの提出方法

1)WordあるいはFrontPageExpressに、考察、ソースリスト、実行グラフィックス画面を貼り付けたものを「Webページ」の形式(拡張子はhtml)で、各自のMyHomeに、cg_03などの名前をつけて保存する。

2)情報系Webサーバが、Turbolinuxで再構築されたので、そのWebページにindex.htmlからのハイパーリンクを作って、登録する。(注を参照のこと。概略は以下のとおり。))
 htmlファイルは、Wordなどで、Webページとして保存する(前述)。そして、ホームページindex.htmlから、今回のレポートページへのリンクを張る。それらを各自のWebサーバのホームディレクトリの直ぐ下のpublic_htmlフォルダ(サブディレクトリ)にftpすること。

 

注) Webページの作り方については、関谷のWebページの「個人ホームページの作成と更新」のページを参照のこと。(Webサーバの再構築が完了した。)
(なお、ローカルのホームページフォルダは、c:\でなく、各自のサーバのホーム(H:)ドライブに作ること。)
 作業としては、public_htmlフォルダの作成とそこでのindex_htmlファイルの変更−名前を表示したり、今回のページに対するリンクを作る−が必要になる。

最初に戻る