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の行列の積により行います。
基本的なものとして以下のような座標変換行列があります。
後で説明しますが、これら行列の中身は知っておくべきですが、常に書けるようになる必要はありません。
上記の変換の他に、例えば座標(1,0,0)にZ軸周り90度で回転したいときは、
回転行列と移動行列の積を行えばOKです。
ところで、行列の合成は拡大縮小→回転→移動の順に行わないと、正しい位置に移動できないので注意が必要です。回転はモデル中心ではなく原点中心で行われるからです。
ところで、ここまでモデルの座標変換だけでカメラについては出てきませんでしたが、
カメラはモデルと相対関係(モデルが動くのとカメラが逆に動くのが同じ)にあるので、モデルビュー行列はそれらを一括で表現できるわけです。
といってもそれでは分かりづらいのでDirectXやXNAでは
ついでに言っときますが、この行列は原点の移動も兼ねています。オブジェクトaから見たオブジェクトbの位置姿勢が行列Bで表されるとき、原点から見たオブジェクトbの位置姿勢(ワールド行列B’)はオブジェクトaのワールド行列Aを用いて、
B’=BA
で表すことができます。
これを使えば関節の動きなども表現できますね。
※DirectXはOpenGLとはかける順序が逆になるはずです。ご注意を。
射影変換
射影変換で設定する項目は以下のとおりです。
ビューポート変換
ビューポート変換は印刷作業です。これまでの変換で出来た映像を画面に印刷します。
左右半分ずつの対戦画面は、ビューポート変換時に印刷対象として画面の半分を指定して出力しています。
このとき印刷する画面のアスペクト比が射影変換と同じでないと縦や横に伸びた映像になってしまうので注意が必要です。
ビューポート変換は他の2つの変換と違い、行列ではなくViewport構造体でパラメータを指定します。
XNAでの行列生成
モデルビュー変換、射影変換は行列を用いて行うものですが、いちいち自分で行列の値を1つずつ指定する必要はありません。
XNAには少ないパラメータで目的の行列を生成してくれるありがたい関数があるのです。
次回はXNAの行列生成関数について調べます。
※本記事を書くにあたりこちらとこちらを参考にさせていただきました。
早速ファイルを読み込んで表示…といきたいところですが、
今回は自分の復習のために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では
- ワールド行列(モデルの配置)
- ビュー行列(カメラの配置)
ついでに言っときますが、この行列は原点の移動も兼ねています。オブジェクトaから見たオブジェクトbの位置姿勢が行列Bで表されるとき、原点から見たオブジェクトbの位置姿勢(ワールド行列B’)はオブジェクトaのワールド行列Aを用いて、
B’=BA
で表すことができます。
これを使えば関節の動きなども表現できますね。
※DirectXはOpenGLとはかける順序が逆になるはずです。ご注意を。
射影変換
射影変換で設定する項目は以下のとおりです。
- 画角
- アスペクト比
- Nearプレーン、Farプレーン
ビューポート変換
ビューポート変換は印刷作業です。これまでの変換で出来た映像を画面に印刷します。
左右半分ずつの対戦画面は、ビューポート変換時に印刷対象として画面の半分を指定して出力しています。
このとき印刷する画面のアスペクト比が射影変換と同じでないと縦や横に伸びた映像になってしまうので注意が必要です。
ビューポート変換は他の2つの変換と違い、行列ではなくViewport構造体でパラメータを指定します。
XNAでの行列生成
モデルビュー変換、射影変換は行列を用いて行うものですが、いちいち自分で行列の値を1つずつ指定する必要はありません。
XNAには少ないパラメータで目的の行列を生成してくれるありがたい関数があるのです。
次回はXNAの行列生成関数について調べます。
※本記事を書くにあたりこちらとこちらを参考にさせていただきました。
Comment
コメントの投稿
Track Back
TB URL