Derelict Assimp not loading mesh properly? (Maybe index buffer)

Rene Zwanenburg via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Mar 7 05:11:20 PST 2015


On Friday, 6 March 2015 at 02:41:19 UTC, Bennet wrote:
> I wrote a custom OBJ file importer which worked fairly well 
> however was not robust enough to support everything. I've 
> decided to give AssImp a shot. I followed some tutorials and 
> have set up my code to read in the vertices, tex coords, 
> normals, and indices of an OBJ cube model that I have had 
> success loading with my custom importer. The cube model's faces 
> do not render properly, instead only rendering a few tri's of 
> the cube. The way AssImp handles the data is obviously a bit 
> different than my solution because the normals, 
> positions/vertices, tex coords, and indices do not match my 
> custom solution. I would very much appreciate some insight into 
> why I'm having issues as all of the tutorials I've found have 
> matched my approach. If a picture of the faulty rendered cube 
> would be helpful I can work on getting a screenshot up. Thank 
> you.
> My Asset importing class is at:
> http://codebin.org/view/4d2ec4d3
> The rest of my code is at (Mesh Class is in source/graphics):
> https://github.com/BennetLeff/PhySim

There are some issues with your loadMesh code:

     numVerts = mesh.mNumFaces * 3;

The number of vertices is independent if the number of faces. 
What you're calculating here is the number of indices, which is 
indeed guaranteed to be three times the number of faces since 
you're asking for triangulation when loading the scene. The 
number of vertices is simply:
     mesh.mNumVertices
And this value should be used as size for the vertex, normal, and 
texture coordinate arrays.

Then you'll need two separate loops to load the vertices and 
indices. Loading the vertices is simply looping through all 
vertex arrays of the source mesh and copying them to your vertex 
arrays.

To load the indices you need to loop through all faces in the 
source mesh, and then add the face indices to your index buffer. 
Something like this:
foreach(faceIndex; 0 .. mash.mNumFaces)
{
   auto face = mesh.mFaces[faceIndex];
   foreach(i; 0 .. 3)
     indices[faceIndex*3 + i] = face.mIndices[i];
}


More information about the Digitalmars-d-learn mailing list