3D数学を勉強する際に、計算結果を映像で確認できると一層理解が深まります。
いや、そもそもの理解に役立つと考え、先に3Dオブジェクトを表示させることにしましょう。
どうも、星姫です。
先週と先々週は真ぷるスター先生が体調を崩されたのでこんなに時間が空いてしまいました。
突然ですが、世界の中心ってどこだか分かりますか?(どこだと思っていますか?)
答えは様々、「自分を中心に…」なんて言ってる方はオブジェクト座標系で物事を考えている方ですね。
地球のどこかを指定した方はワールド座標系で物事を考えている…なんのこっちゃって方は是非楽しんでいってね!
ここから本題に入ります。
まずは3Dオブジェクトの表示からです。思い返せば第17話でDirect 3Dのチュートリアルをやりましたね。
Tutorial05ではマトリックスを用いたオブジェクトの回転移動が行われていました。今回はそれをベースに作ってみましょう。
サンプルブラウザの起動の方法は覚えていますか?全てのプログラム、上図でいうここをクリックして起動します。
起動したらTutorial05.cppファイルを開いてください。以下にTutorial05.cppに書かれているエントリポイントを示します。
可読性が高いコードですね、ウィンドウを作成する→デバイスの設定をする→描画ループ→終了処理が見ただけで分かります。
ではRender()関数で何が行われているのか見てみましょう。以下はRender()関数のコードです。
このコードは行列(Matrix)の知識が無いと難しいですね。コードを読んで、どんな動きをするか想像できました?
初見はなかなか疲れます。
ではコードの解析を上から順に行ってみます。
まずは次のコードの意味から
これは、変数 t を更新しているコードですね。
時間が経つにつれて値が大きくなっていくようです。
続いてこちら
なにやら計算を行い g_World1と g_World2の二つのマトリックスを設定するコードですね。
コメントより、これらは二つのボックスの位置を表す行列と推測できます。変数 t によって位置が変わります。
次のこれは…
バックバッファと深度バッファのクリアですか。
モニタへの描画の仕組みを知ると、理解できると思います。
ちょっとWebで勉強できる場所を探したんですけど、なかなか良いサイトが見当たらなくて
あれですね、私が勉強した本を紹介しておきます。
今はこちらがおススメでしょうか→「ゲームプログラミング入門」
とにかく、この二つをクリアしておかないと、前回描画した絵が残されてしまい、意図した結果が得られません。
では次にいきます。
ここでは、「ワールド」→「ビュー」→「プロジェクション」の流れでマトリックスの設定を行っています。
詳しく知りたい方はこちら
「ワールド」…オブジェクトの位置を決める。
「ビュー」…カメラから見たオブジェクトの位置を決める。
「プロジェクション」…3次元座標から画面の2次元座標へ「投影」する。
問題は次の描画の命令ですね。
これ…どう思います?
日本語訳するなら、レンダリング技術の記述内容を取得して
技術パスの回数だけその技術の適用+登録されているインデックスリストの描画…かな?
ちゃんと学びたい方は、次の公式の文書を参考に勉強してください。
つまりどこかで3次元の頂点情報と、三角形を構成するように
それらの頂点を結ぶ順番を記述したインデックスリストがあって
それを事前にデバイスへセットしていたとのこと。
それの記述されている場所は、InitDevice関数とある。
InitDevice関数の一部を以下に示します。
手続きのコードは煩雑だけど手順としては次の流れで理解できると思います。
ああ、プリミティブトポロジの説明がまだでしたね。
なんぞや?という方は以下のページを参照してみましょう。
一応、描画に必要な情報は、全て揃ったようですが、すこし覚えることが多い気がします。
さて、頂点情報の設定とインデックス情報の設定方法がなんとなく見えてきたところで
モデルデータから頂点情報とインデックス情報を作成して、どんな結果が得られるのか見てみましょう。
ん?…モデルデータの頂点の並びってどうなっているのでしょうか?
モデリングツール…今は
だけしか習得していませんが、他に
がフリーのモデリングソフトで有名なんです。(会社の同期に教わりました)
blenterについてはまだ、使い勝手とかわからないので
簡単なチュートリアルを作ってみます。
メタセコイアでの作業がblenderでもできるのなら
シェアの大きいBlenderに乗り換えるつもりです。
次回、お楽しみに!
2010/05/23 初記。
2010/05/24 追加。
2010/05/30 追加。
2010/06/05 追加。