2010年5月26日水曜日
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;
}
// いままでの計算は、以下のメソッドで行うようにしている
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ファイルからのスキンウェイトとアニメーションの
読み込みとアニメーションの実装を行いたい。
(完全には程遠いいものの)自前の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;i
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の内容は、以下
どうやら使えそうだ。
>"C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Utilities\bin\x64\Texconv.exe" xxx.dds -ft png
で実行してみたところ、pngファイルに変換できた。
しようと計画。
まず、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 9 | Direct3D 10 | 64 ビット ネイティブ モード | Windows?XP | Windows?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 つを指定します。NONE、POINT、LINEAR、TRIANGLE、BOX、NONE_DITHER、POINT_DITHER、LINEAR_DITHER、TRIANGLE_DITHER、 または BOX_DITHER。名前に DITHER が含まれるフィルターは、4×4 の順序つきディザー アルゴリズムも適用されることを示しています。これらのフィルターについては「D3DX_FILTER」 を参照してください。 |
-m number | 出力テクスチャーに 生成されるミップマップ レベルの数。この設定は DDS 出力にのみ適用されます。詳細については、「ミッ プマップによるテクスチャー フィルタリング (Direct3D 9)」を参照してください。 |
-mf filter | D3DX_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]:モデルの移動を一時停止と再開
■修正内容
・視点を移動できるようにしてみた。
<操作方法>
[W]:視点を前に移動
[S]:視点を後ろに移動
[A]:視点を左に移動
[D]:視点を右に移動
[SHIFT+W]:視点を上に移動
[SHIFT+S]:視点を下に移動
[SHIFT+A 又は →]:視点を左に向ける
[SHIFT+D 又は ←]:視点を右に向ける
[↑]:視点を上に向ける
[↓]:視点を下に向ける
[SHIFT + →]:視点を進行方向を軸とし右に回転
[SHIFT + ←]:視点を進行方向を軸とし左に回転
[ESC]:モデルの移動を一時停止と再開
2010年5月11日火曜日
モデルを歩かせてみる。(3Dモデル表示Javaアプレットに機能追加してみた)
以前、作成した3Dモデル表示のJavaアプレットに、さらに機能を追加してみた。
■追加修正内容
・階層的に行列演算を行えるように修正
・メタセコイアで作成した同一オブジェクトの任意の頂点のみを行列演算を行えるように修正
<操作方法>
[マウス左ドラッグ]:オブジェクトの回転
[マウス右ドラッグ]:オブジェクトの移動
[ホイール]:オブジェクトの拡大・縮小
■追加修正内容
・階層的に行列演算を行えるように修正
・メタセコイアで作成した同一オブジェクトの任意の頂点のみを行列演算を行えるように修正
<操作方法>
[マウス左ドラッグ]:オブジェクトの回転
[マウス右ドラッグ]:オブジェクトの移動
[ホイール]:オブジェクトの拡大・縮小
2010年5月10日月曜日
登録:
投稿 (Atom)