Mesh laden - Will nicht
-
Vorweg, ich benutze Managed DirectX und C#...
Ich habe ein Mesh(.x file) mit Cinema 4d erzeugt und will diese nun laden.
ExtendedMaterial[] mExtMat; myMesh = Mesh.FromFile("bridge.x", MeshFlags.Managed, gDevice, out mExtMat); if ((mExtMat != null) && (mExtMat.Length > 0)){ mBackMat = new Material[mExtMat.Length]; mBackTex = new Texture[mExtMat.Length]; for (int a = 0; a < mExtMat.Length; a++){ mBackMat[a] = mExtMat[a].Material3D; if ((mExtMat[a].TextureFilename != null) && (mExtMat[a].TextureFilename != String.Empty)){ mBackTex[a] = TextureLoader.FromFile(gDevice, mExtMat[a].TextureFilename); } } }
Beim Kompilieren kommt die meldung:
Eine nicht behandelte Ausnahme des Typs "Microsoft.DirectX.Direct3D.Direct3DXException" ist in Microsoft.DirectX.Direct3DX.dll aufgetreten.
Zusätzliche Informationen: Fehler in der Anwendung.
und die Zeile
myMesh = Mesh.FromFile("bridge.x", MeshFlags.Managed, gDevice, out mExtMat);
wird als Fehlerquelle angegeben. Die Mesh´s vom DX SDK kann man aber laden, nur meine eigenen nicht?
An was könnte das liegen?
-
Also wenn du an der stelle Problemlos ein Mesh aus dem SDK laden kannst würde ich sagen das C4D evtl beim Exportieren mist gebaut hat, das wäre naheliegend. Einige Exporter der bekannteren Anwendungen sind nciht imemr Fehlerfrei.
-
gibts andere gute?. Ich hab mal was von blender gehört, aber noch nie in Action gesehen?!?
-
Es gibt glaub von MS nochn Tool für dx das diverse Formate nach x konvertieren kann evtl bringt dich das weiter. Ansonsten kannste nur auf die Bequemlichkeit verzichten und evtl selebr nen Loader für n anderes Format schreiben oder einen vorhandenen benutzen, das schließt dann aber eigene Renderfunktionen usw mit ein, ist aber nicht so schwer.
-
zum Beispiel conv3ds.exe
Diese Wandelt 3DS-Dateien in .x-Dateinen um, funktioniert ganz gut.
LG fluid
-
ich weiss auch nicht, egal mit wechen tool, da geht nix.
Das Mesh Tool vom DX SDK läd die dateien aber auch, nur ohne texturen.
-
kuck mal in das Tutorial, du musst erst noch die Texturen dazuladen und die Matrialien setzen,dann geht das schon
wie im Tutorial:
http://www.directxtutorial.com/Tutorial9/C-Direct3DMeshes/dx9C2.aspx
viel Spaß
p.s.: bei mir hats das funktioniert
-
ich hab rausgefunden das es nur probleme gibt wenn ich texturen dazu lade, ohne gehts ganz gut, sieht halt scheisse aus
-
kuck, doch mal ob du das vertexformat richtig setzt und die Texturen kannste ja auch noch mit trillinearem Filtering verbessern, das ist schon ganz annehmbar.
LG fluid
-
welches format sollte das sein?
Hab schon einige durch
-
zum Laden des Meshes folgenden Code verwenden:
LPD3DXBUFFER bufMaterial;
D3DXLoadMeshFromX(pchFileName,D3DXMESH_MANAGED,pDevice9,NULL,&bufMaterial,NULL,&mdwNumMatrerials,&mMesh);
D3DXMATERIAL* ptempMaterials = (D3DXMATERIAL*)bufMaterial->GetBufferPointer();
mpMaterialArray = new D3DMATERIAL9[mdwNumMatrerials];
mpTextureArray = new LPDIRECT3DTEXTURE9[mdwNumMatrerials];
for(DWORD i = 0; i < mdwNumMatrerials; i++)
{mpMaterialArray[i] = ptempMaterials[i].MatD3D;
mpMaterialArray[i].Ambient = mpMaterialArray[i].Diffuse;if(FAILED(D3DXCreateTextureFromFile(pDevice9,(LPCSTR)(ptempMaterials[i].pTextureFilename),&mpTextureArray[i])))
{
mpTextureArray[i] = NULL; // if there is no texture, set the texture to NULL
}}
// zum Rendern
pDevice9->SetRenderState(D3DRS_LIGHTING,FALSE);
for (DWORD i= 0; i< mdwNumMatrerials;i++)
{
pDevice9->SetMaterial(&mpMaterialArray[i]);
if(mpTextureArray[i] != NULL)
{pDevice9->SetTexture(0,mpTextureArray[i]);
}
else
{
pDevice9->SetTexture(0,NULL);
}g_pD3DDevice9->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
mMesh->DrawSubset(i);
}
pDevice9->SetTexture(0,NULL);
pDevice9->SetRenderState(D3DRS_LIGHTING,FALSE);
}
}// ein vertex besteht aus
struct S_VERTEX_MESH
{
D3DVEKTOR vPos;
D3DVEKTOR vNorm;
D2DVEKTOR vTex;};
also müsste man das VertexFormat setzen:
device9->SetFvF(D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
lg Fluid
-
Danke, aber ich verwende Managed DirectX und C#.
Die ähnlichkeit ist aber verblüffend.
-
Na dann hoff ich trozdem mal, dass ich dir helfen konnte.
LG fluid
-
ich will sowieso das ganze in c++ umsetzen. Die Schreibweise ist zwar etwas anderst(komplizierter) und die Umgebung unterstützt einen mehr in c# aber allein von der geschwindigkeit und der Plattform unabhängigkeit her sollte man c++ verwenden.