fc2ブログ

ばぐだし

XNAとかで面白いもの作る。

3DCGの基礎

今回からいよいよ3Dモデルの描画に挑戦します。

早速ファイルを読み込んで表示…といきたいところですが、
今回は自分の復習のために3Dモデルがどのようにして描画されるかを書きたいと思います。
というのも、3次元の描画は行列を多用するので、仕組みが分かってないとわけわからなくなる恐れがあるからです。

3Dモデルの描画とは?
3Dモデルというのは、要は点の集まりです。点どうしが線を描いたり面(ポリゴン)を作ったりして3次元物体を表現するのです。

では、3Dモデルを画面に出力するってのはどういうことか?
それは3次元の点P(X,Y,Z)を画面(2次元)の点Q(x,y)に変換することです。

ではどうやって変換すればよいのか?
その答えは簡単。私たちの目やカメラの、物理的な仕組みをシミュレートすればよいのです。

3つの変換
3次元の点Pを2次元の点Qに変換するには以下の3つの変換を行います。

P -> (モデルビュー変換) -> (射影変換) -> (ビューポート変換) -> Q

モデルビュー変換は、3D空間中のモデルの位置・姿勢を表します。カメラの位置・姿勢も兼ねています。
射影変換は、いわば視界の定義です。ズームイン、ズームアウトや、アスペクト比などを設定します。
ビューポート変換は射影変換で出来た画像を画面に印刷する作業です。画面全体に表示することが多いです。

モデルビュー変換
モデルビュー変換は点P(X,Y,Z)に4次元目の値1を加えたベクトル[X,Y,Z,1]と4×4の行列の積により行います。
基本的なものとして以下のような座標変換行列があります。
  • なにもしない行列
  • 移動
  • 拡大縮小
  • X軸回転・Y軸回転・Z軸回転
  • 任意軸周りの回転
具体的な行列の値は下記参考サイト様を見てください。
後で説明しますが、これら行列の中身は知っておくべきですが、常に書けるようになる必要はありません。

上記の変換の他に、例えば座標(1,0,0)にZ軸周り90度で回転したいときは、
回転行列と移動行列の積を行えばOKです。

ところで、行列の合成は拡大縮小→回転→移動の順に行わないと、正しい位置に移動できないので注意が必要です。回転はモデル中心ではなく原点中心で行われるからです。

ところで、ここまでモデルの座標変換だけでカメラについては出てきませんでしたが、
カメラはモデルと相対関係(モデルが動くのとカメラが逆に動くのが同じ)にあるので、モデルビュー行列はそれらを一括で表現できるわけです。

といってもそれでは分かりづらいのでDirectXやXNAでは
  • ワールド行列(モデルの配置)
  • ビュー行列(カメラの配置)
の2つに分けて設定できるようになっています。

ついでに言っときますが、この行列は原点の移動も兼ねています。オブジェクトaから見たオブジェクトbの位置姿勢が行列Bで表されるとき、原点から見たオブジェクトbの位置姿勢(ワールド行列B’)はオブジェクトaのワールド行列Aを用いて、
B’=BA
で表すことができます。
これを使えば関節の動きなども表現できますね。
※DirectXはOpenGLとはかける順序が逆になるはずです。ご注意を。

射影変換
射影変換で設定する項目は以下のとおりです。
  • 画角
  • アスペクト比
  • Nearプレーン、Farプレーン
画角はズームイン、ズームアウトを行うものです。画角が狭いとズームイン、画角が広いとズームアウトです。アスペクト比は、画面の縦横比です。描画する領域にあわせるとよいでしょう。NearプレーンとFarプレーンは手前と奥がどこまで見えるかを決めるものです。

ビューポート変換
ビューポート変換は印刷作業です。これまでの変換で出来た映像を画面に印刷します。
左右半分ずつの対戦画面は、ビューポート変換時に印刷対象として画面の半分を指定して出力しています。
このとき印刷する画面のアスペクト比が射影変換と同じでないと縦や横に伸びた映像になってしまうので注意が必要です。
ビューポート変換は他の2つの変換と違い、行列ではなくViewport構造体でパラメータを指定します。

XNAでの行列生成
モデルビュー変換、射影変換は行列を用いて行うものですが、いちいち自分で行列の値を1つずつ指定する必要はありません。
XNAには少ないパラメータで目的の行列を生成してくれるありがたい関数があるのです。
次回はXNAの行列生成関数について調べます。


※本記事を書くにあたりこちらこちらを参考にさせていただきました。

≪ Matrix構造体ホームスプライトを貼ってみる ≫

Comment

コメントの投稿

 
管理人にのみ表示する
 

Track Back

TB URL

Home