前回にて、麻雀台シミュレータを作ろうという話をしていました。
頭の中で、「ああしたい」「こうしたい」と思うことが具体的になってきたところで
SimpleConverter への機能要求として、チケットを切ろうと思います。
製作者本人であるシンプルスターも長い間触れていないため、SimpleConverter ってなんだっけというレベル。
読者の方はさらにチンプンカンプンなのではないでしょうか?
ということで、簡単に思い出してみようと思います。
前の話を読み返してみると034話 シェーダマテリアル@にて、
「中間モデルデータからゲーム用データへ変換し、編集できてプレビューも見られるエディタ&コンバータ」
と明記してあります。(なるほど、確かにそんなもの作ってましたね。)
して、現在どこまでのことができるのか確認してみましょう。
フローを書いてみるとこんな感じ↓になります。
フローを簡単に説明します、まず Blender 2.58b で任意のモデルを生成します。
(.blend ファイルを編集・保存します。)
Blender の使い方に困ったら Tips ページ の Blender のカテゴリを参照してください。
Tips にならって、Blend Swap から適当なデータをダウンロードして用意してみます。
今回はこちら Daniel FR Gordillo 様が作成したスカルを使ってみたいと思います。
(お言葉に甘えて、テストデータとして利用させていただきます。)
Blender で .blend ファイルを読み込んだら、まずは.blend から画像ファイルを出力します。
Tips ページ でも示した通り、「UV/Image Editor」 ビューに切り替えて [Image]→[Save as Image] でファイル出力して用意します。
あとは SimpleExporter で XMLファイルを出力して、SimpleConverter(作成中、公開されていません。) で読み込みます。
すると、こんな感じ↑で読み込んだモデルが中央の3Dビューに表示されます。
(図からはわかりづらいかもしれませんが、法線マップには未対応です。)
SimpleConverter は、SimpleExporter 2.0 以降で出力したXMLファイルならば基本的にすべて読み込むことができます。
アニメーションについては、オブジェクトアニメとボーンを使ったスキンメッシュアニメーションまで対応しています。
次の動画で、スキンメッシュアニメーションを表示出来ることを確認しました。
ここまで書いて、やっと思い出してきました。
とりあえず、法線マップに対応していないのが気になるので、対応してみたいと思います。
本格的な機能要求を出す前の準備運動として、法線マップ対応の作業工程を公開してみたいと思います。
(ゲームプログラミングを始めてみようと考えている方にとって、ちょっとだけ参考になるかも?)
機能が必要になった経緯については、上で示してきましたので説明は不要です。
どういった機能が必要なのかを示してみましょう。
「SimpleXMLファイルを読み込んで3Dビューに表示した時点で法線マップが機能して描画されていること。」
はい、ではこれをプロジェクトのチケットに登録します。
チケット?何のことでしょうか。
まずはこちら バグトラッキングシステム(BTS)を用意する方法 を確認してみてください。
ここに示すバグ管理ツールの「機能追加・TODO(やるべき修正)・バグ」の対応を一まとまりにチケットと呼んでいます。
つまりチケットを切る、とは「バグトラッキングシステム(BTS)に対応の詳細を登録する」と言い換えることができます。
BTS を用意しましたら早速チケット切ってみましょう。
とまぁ、こんな感じで登録した後、対応する人を決めてアサイン(割り当て)してスケジュールを切ります。
担当者はステータスを「着手」に更新して、バグならば原因の詳細を記述し、修正方針を対応に示します。
今回は機能追加なので、追加する処理内容の詳細を対応に記述します。
まずは、調査して対応に何を書けば良いのか考えます。
今回最初に確認すべき点は適用されているテクスチャが法線マップなのかチェックできる点です。
Blender より SimpleExporter で出力した SimpleXML ファイルの中身を次に示します。
作った自分がもう覚えていませんが、どうやら法線マップかどうかは
TEXTURE タグの USE_NORMAL_MAP タグの値(True or False)を確認すれば見分けられるようですね。
あとはこれを取得しているソースの箇所を見つけます。
調べるときのキーワードは「TEXTURE, USE_NORMAL_MAP」です。
VisualStudio で「Ctrl + Shift + F」で検索ダイアログを表示し
オプションで、「プロジェクト全体、単語単位、大文字小文字を比較」を指定して検索をかけます。
さっそく次の関数が引っかかりました。
確認してみると TEXTURE_INFO_TYPE_ST 構造体の useNormalMap プロパティにフラグが設定されるようです。
その値の行方を追っていくと、次の関数
XMLtoMDLConv.cpp ファイルの XMLtoMDLConv::_SetDefaultVertexLayout()
にて .mdl ファイルデータクラスのプロパティへ受け渡していることが確認できました。
受け渡し先は MDLData::MDL_PRIMITIVE_INFO_ST 構造体の
メンバ materialInfo である MDL_MATERIAL_INFO_ST 構造体の
メンバ textures である MDLData::MDL_TEXTURE_INFO_ST の
メンバ useNormalMap です。
ということは .mdl データからエフェクトファイル(.fx)を自動作成している部分にて
このフラグを確認できれば良いことになります。
今度はキーワードで検索せず、変換処理を行っているクラスの関数一覧から該当箇所を探します。
関数名から処理内容がはっきりわかるようにしていれば、この場面で見つけるのはたやすいです。
見つけました。
どうも、「シェーダマテリアル」という思想から、マテリアルデータから指定エフェクトファイルで出力する処理にて
シェーダファイルを作成しているようです。
エフェクトファイル作成用として FXWriter クラスというものが用意されていました。
はい、ということでそのクラスにて、テクスチャに法線マップフラグが設定された場合
法線マップ用のシェーダコードを書くようにします。
ここで法線マッピングの基礎知識が必要になりますが
次の書籍の法線マップのコーナーを読んで理解できます。
DirectX 9 シェーダプログラミングブック 著者: 今給黎 隆
インターネットでも、こちら↓を読めば実装方法まで明らかになることでしょう。
0から学ぶ法線マップ
接(ベクトル)空間ねぇ、うーん、高校数学レベルだともしかしたら難しい?
どうしても理解できない方は近くの大学出のお兄さんお姉さんに聞いてみてください。
こんな感じでサクッと調べて、修正方針が固まってきたらチケットの内容を更新します。
対応中のチケットはこんな感じ↓(クリックで原寸)
対応の詳細は、きっと皆さんにとってつまらないのでスキップします。
対応中…
はい!ということで対応できましたー。(クリックで拡大)
以下、確認用画像です。
頂点法線のみ
法線マップ
ディフューズマップ
法線マップ+ディフューズマップ
では具体的に変わった所だけを以下に示します。
修正前は2枚のテクスチャマップを両方ディフューズマップとして処理していました。
今回の機能追加で、次のようにエフェクトファイルが書き換わるようになりました。
対応結果を確認したら、チケットのステータスを「解決済み」にして
結果とリリースノートを埋めます。
リビジョン番号について以下説明します。
ソースの編集作業はひとまず完了しました。
これを提出します。
提出?どこに?
みなさんは Subversion(サブバージョン、サバージョン; SVN)をご存じでしょうか?
いつ、どのファイルが、どのように変更されたのかリビジョンと呼ばれるバージョン番号を元に参照できるというものです。
Windows での GUI 操作で手軽にバージョン管理をする場合は TortoiseSVN を利用します。
導入方法は簡単です、次に示します。
TortoiseSVNの使い方 については一通り目を通していただけたかと思います。
はい、ということでリポジトリに変更を提出します。
前回のリビジョンからの差分があるファイルについて以下のように赤色で確認できます。
提出(コミットと言います)を行ったら、その時のリビジョン番号をチケットに記録します。
これでいつ忘れても、チケットの情報から目的と変更内容が参照できるようになります。
こうして管理することで数ヵ月後、数年後にきっとありがたみが出てくるのではないでしょうか?
今回は一機能追加を公開してみました。本番前の準備運動といったところです。
次回から物理演算対応や.mdlフォーマット策定などの
本格的な機能追加を SimpleConverter に行っていこうと思います。
それでは、お楽しみに!
2011/10/16 初記。
2011/10/23 更新。