3.3 Collision with .obj triangle mesh

Hi,

I’m currently trying to load some obj for a rigid static actor.

loadTriangleMesh("box.obj");
    int nbVertices = vertices.size(), nbTriangles = faces.size()/3;
    PxTriangleMeshDesc meshDesc;
    
    meshDesc.points.count  = nbVertices;
    meshDesc.points.stride = sizeof(PxVec3);
    meshDesc.points.data   = &vertices[0];
    
    meshDesc.triangles.count  =  nbTriangles;
    meshDesc.triangles.stride =  3*sizeof(PxU32);
    meshDesc.triangles.data   =  &faces[0];

    PxDefaultMemoryOutputStream writeBuffer;
    mCooking->cookTriangleMesh(meshDesc, writeBuffer);

    //mesh creation
    PxDefaultMemoryInputData readBuffer = PxDefaultMemoryInputData(writeBuffer.getData(), writeBuffer.getSize());
    PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);
    
    //actor
    PxRigidStatic *meshActor = mPhysics->createRigidStatic(PxTransform());
    PxTriangleMeshGeometry *meshGeo = new PxTriangleMeshGeometry(tm);
    PxShape *meshShape = meshActor->createShape(*meshGeo, *sol);
    mScene->addActor(*meshActor);

here is my loading function :

vector<PxVec3> vertices;
vector<PxU32>  faces;
vector<PxVec3> normals;

void loadTriangleMesh(std::string file)
{
    ifstream f(file);
    char line[255];
    
    while(f.good())
    {
        f.getline(line,255);
        istringstream iss(line);
        string firstWord;
        iss>>firstWord;
        
        if(firstWord == "v")
        {
            PxVec3 v;
            iss>>v.x;
            iss>>v.y;
            iss>>v.z;
            vertices.push_back(v);
        }
        
        if(firstWord == "vn")
        {
            PxVec3 v;
            iss>>v.x;
            iss>>v.y;
            iss>>v.z;
            normals.push_back(v);
        }
        
        if(firstWord == "f")
        {
            PxU32 t1,t2,t3;
            iss>>t1;
            iss>>t2;
            iss>>t3;
            faces.push_back(t1);
            faces.push_back(t2);
            faces.push_back(t3);
        }
    }
    f.close();
}

At the execution here is what i get when i call “PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);” :

./../../GeomUtils/src/GuTriangleMesh.cpp (105) : invalid operation : Gu::TriangleMesh::release: double deletion detected!

Besides i get a segfault when creating the actor.

Any idea ? Thanks !

Mathias

Up ?

Here is my current code :

void Simulator::addTriangleMesh(std::string file)
{
    vector<PxVec3> pos, normals;
    vector<PxU32>  indices;
    
    MeshLoader m(file);
    m.loadMesh();
    
    pos = m.getPos();
    normals = m.getNormals();
    indices = m.getIndices();

    PxTriangleMeshDesc meshDesc;
    meshDesc.points.count = pos.size();
    meshDesc.points.stride = sizeof(PxVec3);
    meshDesc.points.data = &pos[0];
    
    meshDesc.triangles.count = indices.size()/3;
    meshDesc.triangles.stride = 3*sizeof(PxU32);
    meshDesc.triangles.data = &indices[0]; //OK mais il faut pouvoir lire un buffer de PxU32 par pas de 1*sizeof(PxU32) et non pas 3*
    
    PxDefaultMemoryOutputStream writeBuffer;
    mCooking->cookTriangleMesh(meshDesc, writeBuffer);
    
     //mesh creation
    PxDefaultMemoryInputData readBuffer = PxDefaultMemoryInputData(writeBuffer.getData(), writeBuffer.getSize());
    PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);
    
    //actor
    PxRigidStatic *meshActor = mPhysics->createRigidStatic(PxTransform());
    PxTriangleMeshGeometry *meshGeo = new PxTriangleMeshGeometry(tm);
    PxShape *meshShape = meshActor->createShape(*meshGeo, *(mPhysics->createMaterial(0.5,0.5,0.5)));
    mScene->addActor(*meshActor);
    actors.push_back(meshActor);
}
void MeshLoader::loadMesh()
{
    ifstream f(fileName);
    char line[255];
    
    while(f.good())
    {
        f.getline(line,255);
        istringstream iss(line);
        string firstWord;
        iss>>firstWord;
        
        if(firstWord == "v")
        {
            PxVec3 v;
            iss>>v.x;
            iss>>v.y;
            iss>>v.z;
            pos.push_back(v);
        }
        
        if(firstWord == "vn")
        {
            PxVec3 v;
            iss>>v.x;
            iss>>v.y;
            iss>>v.z;
            normals.push_back(v);
        }
        
        if(firstWord == "f")
        {
            string t1,t2,t3;
            int it1, it2, it3;
            iss>>t1;
            iss>>t2;
            iss>>t3;
            
            sscanf(t1.c_str(),"%d//",&it1);
            sscanf(t2.c_str(),"%d//",&it2);
            sscanf(t3.c_str(),"%d//",&it3);
            
            indices.push_back(it1);
            indices.push_back(it2);
            indices.push_back(it3);
        }
    }
    f.close();
}
if(shapes[i]->getGeometryType()  == PxGeometryType::eTRIANGLEMESH)
                    {
                        PxTriangleMeshGeometry ptmg;
                        shapes[i]->getTriangleMeshGeometry(ptmg);
                        
                        vector<PxVec3> v;
                        
                        for(int k = 0; k < ptmg.triangleMesh->getNbVertices(); k++)
                        {
                            v.push_back(ptmg.triangleMesh->getVertices()[k]);
                        }

                        std::cout<<"v.size() "<<v.size()<<endl; 

                        vector<PxU32> indexes;
                        const PxU32 *ind;
                        
                        ind = (const PxU32*)(ptmg.triangleMesh->getTriangles());
                        
                        for(int k=0;k<ptmg.triangleMesh->getNbTriangles();k++)
                        {
                            indexes.push_back(ind[k]);
                        }
                        epv->exportMesh(v, indexes);
                    }

Just to be clearer

pos = m->getPos();
    normals = m->getNormals();
    indices = m->getIndices();

    cout<<"1 nbVertices "<< pos.size()<<" nbTriangles "<<indices.size()/3<<endl;
    
    PxTriangleMeshDesc *meshDesc = new PxTriangleMeshDesc();

    meshDesc->points.count = pos.size();
    meshDesc->points.stride = sizeof(PxVec3);
    meshDesc->points.data = pos.data();

    meshDesc->triangles.count = indices.size()/3;
    meshDesc->triangles.stride = 3*sizeof(PxU32);
    meshDesc->triangles.data = indices.data(); //OK mais il faut pouvoir lire un buffer de PxU32 par pas de 1*sizeof(PxU32) et non pas 3*

    cout<<"2 nbVertices "<< meshDesc->points.count<<" nbTriangles "<<meshDesc->triangles.count<<endl;
    
    PxDefaultMemoryOutputStream *writeBuffer = new PxDefaultMemoryOutputStream();
    bool status = mCooking->cookTriangleMesh(*meshDesc, *writeBuffer);
    if(!status)
        exit(0);

    //mesh creation
    PxDefaultMemoryInputData *readBuffer = new PxDefaultMemoryInputData(writeBuffer->getData(), writeBuffer->getSize());
    PxTriangleMesh * tm = mPhysics->createTriangleMesh(*readBuffer);
    
    cout<<"3 nbVertices "<< tm->getNbVertices()<<" nbTriangles "<<tm->getNbTriangles()<<endl;

this produces the following output :

1 nbVertices 8 nbTriangles 12
2 nbVertices 8 nbTriangles 12
3 nbVertices 7 nbTriangles 7

I’m getting the same error. Anyone know how to fix this? It only happens for me in release mode but its 100% reproducable.