2010年5月17日月曜日

DirectXのマトリクス計算メモ

DirectXのマトリクス計算メモ



// いままでの計算は、以下のメソッドで行うようにしている
public Vector Mult(Vector a)
{
Vector v = new Vector();
v.x = m00 * a.x + m01 * a.y + m02 * a.z + m03;
v.y = m10 * a.x + m11 * a.y + m12 * a.z + m13;
v.z = m20 * a.x + m21 * a.y + m22 * a.z + m23;

return v;
}


// Xファイルからのマトリクス計算は、以下のように行わないと正しい結果が得られない
public Vector MultX(Vector a)
{
Vector v = new Vector();
v.x = m00 * a.x + m10 * a.y + m20 * a.z + m30;
v.y = m01 * a.x + m11 * a.y + m21 * a.z + m31;
v.z = m02 * a.x + m12 * a.y + m22 * a.z + m32;

return v;
}

2010年5月15日土曜日

久しぶりにVC++を使ってみると・・・・

とりあえず、Xファイルからのモデル表示だけは、
(完全には程遠いいものの)自前のJAVA3Dライブラリに機能追加することができた。

[機能]
Xファイルから
フレーム
メッシュ
メッシュ法線
メッシュテクスチャ
メッシュマテリアル
マテリアル
部分をパーサし、Javaアプレットでモデル表示を行う


Xファイルからの
スキンウェイトとアニメーションの実装は、
結構難しくまだできていない。

ところで久しぶりにVC++を使って
解析のためにある情報をデバッグウィンドウに表示したかったのだが
今使用しているのはMicrosoft Visual C++ 2008 Express Editionなので
TRACEマクロが使えない。結構不便である。
printf
cout
なども使ってみたができない。
(もちろんできるわけないのはわかっているけど、とにかくいろいろとやってみたりした)
本当になさけない状態であった。
VC++自体も2年ぶりにさわったので、どうもいろいろと忘れていることが多く
使っていて、ものすごく不器用になってしまったたような気がした。

いろいろと調べているうちに

OutputDebugString
http://msdn.microsoft.com/ja-jp/library/cc428973.aspx

を使えば表示できることがわかった。


解析したい部分に、以下のような感じで追加してみたりした。

#ifdef _DEBUG
char debug[512];
sprintf(debug,"■%s \n",name);
OutputDebugString(debug);
#endif




void CHogeHoge::TraceMatrix(const char* name) {

#ifdef _DEBUG
char debug[512];
sprintf(debug,"■%s \n",name);
OutputDebugString(debug);
int limit = fr.size();
for(int i=0;iMatrix._11,fr[i]->Matrix._12,fr[i]->Matrix._13,fr[i]->Matrix._14 );
OutputDebugString(debug);
sprintf(debug,"%f %f %f %f\n",fr[i]->Matrix._21,fr[i]->Matrix._22,fr[i]->Matrix._23,fr[i]->Matrix._24 );
OutputDebugString(debug);
sprintf(debug,"%f %f %f %f\n",fr[i]->Matrix._31,fr[i]->Matrix._32,fr[i]->Matrix._33,fr[i]->Matrix._34 );
OutputDebugString(debug);
sprintf(debug,"%f %f %f %f\n",fr[i]->Matrix._41,fr[i]->Matrix._42,fr[i]->Matrix._43,fr[i]->Matrix._44 );
OutputDebugString(debug);
}

#endif


}



とりあえず、来週までに、
JAVA3Dアプレットに
Xファイルからのスキンウェイトとアニメーションの
読み込みとアニメーションの実装を行いたい。

2010年5月14日金曜日

Xファイルを読み込む機能を追加 しようと計画

自作の3Dモデル表示ライブラリ(Java)に、とりあえずXファイルを読み込む機能を追加
しようと計画。


まず、DirectX SDK最新を取得し、インストール
それから参考にしたいVC++のプログラムがあったので、コンパイルしてみると

fatal error C1083: include ファイルを開けません。'dmusicc.h': No such file or directory

というメッセージがでた。


理由は、

dmusicc.hとdmusici.hはDirectMusic関連のヘッダファイルですが、DirectX SDK August 2007を最後に廃止されました。

ということらしい。


参考にしたい部分は、Xファイルをどのように使用しているかなので
サウンド部分は、必要ないので、とりあえずサウンド関連クラスはかたっぱしから削除し続けて実行できるようにしてみた。


実行できるようになったので、ソースとXファイルをしばし見てみる。


Xファイルを眺めていると、

     TextureFilename {
      "xxxx.dds";
     }

という部分があった。



このファイル形式は、


DxTex.exe

を使えば、見ることができることがわかったが、
とりあえずファイル形式をpngに変換したいと考え
DirectX SDKのフォルダを見てみると、それらしきものがあった。

その名は、Texconv.exe

検索してみると、MSDNのページがヒットした。
http://msdn.microsoft.com/ja-jp/library/bb206243%28VS.85%29.aspxの内容は、以下

テクスチャー変換ツール (Texconv.exe)

次のフォーマット間でテクスチャーを変換 するコマンド ライン ツールです。BMP、DDS、JPEG、HDR、PFM、または PNG。

互 換性チャート

Direct3D 9Direct3D 1064 ビット ネイティブ モードWindows?XPWindows?Vista

あ り

不要

あり

あり

あ り

Path

実行ファイル Texconv.exe は、以下のようにプラットフォームによって異なる場所にあります。

32 ビットDirectX SDK ルート\Utilities\Bin\x8664 ビットDirectX SDK ルート\Utilities\Bin\x64

構文

Texconv.exe では、次のコマンド構文を使用します。

texconv [-w number] [-h number] [-d number] [-m number] [-f format] [-if filter] [-mf filter] [-c color] [-srgbi] [-srgbo] [-px string] [-sx string] [-o directory] [-ft file-type] [-nologo] file-name

file-name パラメーターは、変換対象のファイルを指定します。

オプションのコマンドライン スイッチを、次の表に示します。

オ プション スイッチ説明
-c colorカ ラーキー値。このカラーは、ソース テクスチャー内にあると、出力テクスチャー内では透明な黒の値 (0x000000) に置き換えられます。出力テクスチャー内にアルファ チャンネルがあると、指定したカラーがこれにより、透明になります。アルファ チャンネルが存在しない場合は、黒に変更されます。このカラーを指定する場合は常に、アルファ値 (カラーが不透明の場合は FF を使用) を含めるようにします。たとえば、-c FFFE02A5 と指定すると、カラーキー値はソリッドのマゼンタになります。
-d number出 力テクスチャーの深度。この設定は、ボリューム テクスチャーにのみ適用されます。
-f format出 力形式。D3DFORMAT の任意のフォーマットをプレフィックス D3DFMT_ なしで指定します (例外:D3DFMT_MULTI2_ARGB8)。
-ft file-type出 力テクスチャーのファイル タイプ。次のいずれか 1 つを指定します。bmp, dds, jpg, hdr, pfm, png, or tga。デフォルト値は dds です。
-h number出 力テクスチャーの高さ (ピクセル単位)。
-w number出 力テクスチャーの幅 (ピクセル単位)。
-if filterイ メージ フィルター。次のいずれか 1 つを指定します。NONEPOINTLINEARTRIANGLEBOXNONE_DITHERPOINT_DITHERLINEAR_DITHERTRIANGLE_DITHER、 または BOX_DITHER。名前に DITHER が含まれるフィルターは、4×4 の順序つきディザー アルゴリズムも適用されることを示しています。これらのフィルターについては「D3DX_FILTER」 を参照してください。
-m number出力テクスチャーに 生成されるミップマップ レベルの数。この設定は DDS 出力にのみ適用されます。詳細については、「ミッ プマップによるテクスチャー フィルタリング (Direct3D 9)」を参照してください。
-mf filterD3DX_FILTER で規定されているミップマップ フィルター値。
-o directory出 力ディレクトリ。
-px string得られるテクスチャー の名前の前に付加されるテキスト文字列。

-srgbi または

-srgbo

-sRGBi は、入力データが sRGB (ガンマ 2.2) カラー フォーマットであることを示す場合に使用します。-sRGBo は、出力データが sRGB カラー フォーマットであることを示す場合に使用します。
-sx string得 られるテクスチャーの名前の後に付加されるテキスト文字列。
-nologo著 作権に関するメッセージを除外します。




どうやら使えそうだ。

>"C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Utilities\bin\x64\Texconv.exe" xxx.dds -ft png


で実行してみたところ、pngファイルに変換できた。

2010年5月13日木曜日

視点の移動

以前、作成した3Dモデル表示のJavaアプレットに、さらに機能を追加してみた。

■修正内容
・視点を移動できるようにしてみた。



<操作方法>
[W]:視点を前に移動
[S]:視点を後ろに移動
[A]:視点を左に移動
[D]:視点を右に移動
[SHIFT+W]:視点を上に移動
[SHIFT+S]:視点を下に移動
[SHIFT+A 又は →]:視点を左に向ける
[SHIFT+D 又は ←]:視点を右に向ける
[↑]:視点を上に向ける
[↓]:視点を下に向ける
[SHIFT + →]:視点を進行方向を軸とし右に回転
[SHIFT + ←]:視点を進行方向を軸とし左に回転
[ESC]:モデルの移動を一時停止と再開

2010年5月11日火曜日

モデルを歩かせてみる。(3Dモデル表示Javaアプレットに機能追加してみた)

以前、作成した3Dモデル表示のJavaアプレットに、さらに機能を追加してみた。

■追加修正内容
・階層的に行列演算を行えるように修正
・メタセコイアで作成した同一オブジェクトの任意の頂点のみを行列演算を行えるように修正




<操作方法>
[マウス左ドラッグ]:オブジェクトの回転
[マウス右ドラッグ]:オブジェクトの移動
[ホイール]:オブジェクトの拡大・縮小