0

これは、.xメッシュを表示するための私のプログラムです。メッシュtiger.xを表示することはできますが、 ball.xを表示することはできません。2つのメッシュの違いは何ですか?コードで処理する必要があるものはありますか?ただし、DirectX SDKに付属しているような標準のメッシュビューアを使用して、両方のメッシュを表示できます。

ありがとう。

4

2 に答える 2

1

ただし、ball.xを表示することはできません。

質問は不明確です。メッシュはロードされますか?頂点/面が含まれていますか?または多分それはアプリをクラッシュさせますか?または読み込みに失敗しますか?

2つのメッシュの違いは何ですか?

違いは、2番目のメッシュ(ball.x)に「テンプレート」が含まれていないことです。

つまり、この部分:

template Header {
 <3D82AB43-62DA-11cf-AB39-0020AF71E433>
 WORD major;
 WORD minor;
 DWORD flags;
}

template Vector {
 <3D82AB5E-62DA-11cf-AB39-0020AF71E433>
 FLOAT x;
 FLOAT y;
 FLOAT z;
}

template Coords2d {
 <F6F23F44-7686-11cf-8F52-0040333594A3>
 FLOAT u;
 FLOAT v;
}

template Matrix4x4 {
 <F6F23F45-7686-11cf-8F52-0040333594A3>
 array FLOAT matrix[16];
}

template ColorRGBA {
 <35FF44E0-6C7C-11cf-8F52-0040333594A3>
 FLOAT red;
 FLOAT green;
 FLOAT blue;
 FLOAT alpha;
}

template ColorRGB {
 <D3E16E81-7835-11cf-8F52-0040333594A3>
 FLOAT red;
 FLOAT green;
 FLOAT blue;
}

template IndexedColor {
 <1630B820-7842-11cf-8F52-0040333594A3>
 DWORD index;
 ColorRGBA indexColor;
}

template Boolean {
 <4885AE61-78E8-11cf-8F52-0040333594A3>
 WORD truefalse;
}

template Boolean2d {
 <4885AE63-78E8-11cf-8F52-0040333594A3>
 Boolean u;
 Boolean v;
}

template MaterialWrap {
 <4885AE60-78E8-11cf-8F52-0040333594A3>
 Boolean u;
 Boolean v;
}

template TextureFilename {
 <A42790E1-7810-11cf-8F52-0040333594A3>
 STRING filename;
}

template Material {
 <3D82AB4D-62DA-11cf-AB39-0020AF71E433>
 ColorRGBA faceColor;
 FLOAT power;
 ColorRGB specularColor;
 ColorRGB emissiveColor;
 [...]
}

template MeshFace {
 <3D82AB5F-62DA-11cf-AB39-0020AF71E433>
 DWORD nFaceVertexIndices;
 array DWORD faceVertexIndices[nFaceVertexIndices];
}

template MeshFaceWraps {
 <4885AE62-78E8-11cf-8F52-0040333594A3>
 DWORD nFaceWrapValues;
 Boolean2d faceWrapValues;
}

template MeshTextureCoords {
 <F6F23F40-7686-11cf-8F52-0040333594A3>
 DWORD nTextureCoords;
 array Coords2d textureCoords[nTextureCoords];
}

template MeshMaterialList {
 <F6F23F42-7686-11cf-8F52-0040333594A3>
 DWORD nMaterials;
 DWORD nFaceIndexes;
 array DWORD faceIndexes[nFaceIndexes];
 [Material]
}

template MeshNormals {
 <F6F23F43-7686-11cf-8F52-0040333594A3>
 DWORD nNormals;
 array Vector normals[nNormals];
 DWORD nFaceNormals;
 array MeshFace faceNormals[nFaceNormals];
}

template MeshVertexColors {
 <1630B821-7842-11cf-8F52-0040333594A3>
 DWORD nVertexColors;
 array IndexedColor vertexColors[nVertexColors];
}

template Mesh {
 <3D82AB44-62DA-11cf-AB39-0020AF71E433>
 DWORD nVertices;
 array Vector vertices[nVertices];
 DWORD nFaces;
 array MeshFace faces[nFaces];
 [...]
}

template FrameTransformMatrix {
 <F6F23F41-7686-11cf-8F52-0040333594A3>
 Matrix4x4 frameMatrix;
}

つまり、テンプレート/構造体の宣言。

また、ball.xでは、メッシュはフレームの階層の一部です。tiger.xではそうではなく、階層の最上位に格納されます。

最後に*.xファイルを直接使用してからしばらく経ちましたが、私が知る限り、すべての「非標準」テンプレートのテンプレートをファイルに含める必要があります。つまり、ファイルがID3DXFileまたはIDirectXFileのRegisterTemplatesメソッドを使用して登録されていないテンプレートを持つオブジェクトを使用している場合、テンプレートがファイルの先頭に書き込まれていないと、ファイルはロードされません。原因が見つかるまで、ball.x内のすべての疑わしい構造のテンプレート定義を追加してみてください。「ヘッダー」から始めます。

問題が階層にある場合は、別の読み込み方法を試す必要があります。

DirectXSDKに付属しているような標準のメッシュビューアを使用します。

AFAIK、メッシュビューアにはソースコードが付属しています。ソースを読んで、それがどのように機能するかを確認してください。

于 2010-08-09T02:22:41.270 に答える
0

メッシュには問題はありませんが、ビューです。ズームインしすぎて画像を表示できませんでした。次のマトリックスを使用して画像を投影し、メッシュを正しく表示することができました。

//Set Projection
D3DXMATRIXA16 matProj(1.0,0.0,0.0,0.0,
                      0.0,1.0,0.0,0.0,
                      0.0,0.0,1.0,0.0,
                      0.0,0.0,0.0,150.0);
于 2010-08-10T11:54:23.427 に答える