cookTriangleMesh 访问异常

cookTriangleMesh access exception

提问人:shroow 提问时间:9/22/2023 更新时间:10/13/2023 访问量:29

问:

PxTriangleMesh* PhysX::CreateTriangleMesh(const PxVec3* verts, const PxU32 numVerts
    , const PxU32* indexs, const PxU32 numIndexes, PxPhysics* physics, PxCooking* cooking)
{
    // Create descriptor for triangle mesh
    PxTriangleMeshDesc meshDesc;
    meshDesc.points.count = numVerts;
    meshDesc.points.stride = sizeof(PxVec3);    
    meshDesc.points.data = verts;

    meshDesc.triangles.count = numIndexes / 3;
    meshDesc.triangles.stride = 3 * sizeof(PxU32);
    meshDesc.triangles.data = indexs;

    // for prevent stackoverflow
    PxU32 estimatedVertSize = numVerts * sizeof(PxVec3) * 1.5;
    PxU32 estimatedIndexSize = numIndexes * sizeof(PxU32) * 1.5;
    PxU32 initialSize = estimatedVertSize + estimatedIndexSize;
    CustomPhysXMemory writeBuffer(initialSize);

    //PxDefaultMemoryOutputStream writeBuffer;
    bool status = cooking->cookTriangleMesh(meshDesc, writeBuffer);
    if (!status)
        return nullptr; 

    PxDefaultMemoryInputData readBuffer(writeBuffer.getData(), writeBuffer.getSize());
    PxTriangleMesh* triangleMesh = physics->createTriangleMesh(readBuffer);

    return triangleMesh;
}

我想给一个碰撞体来通过assimp对负载进行网格划分,所以我制作了一个physX三角形网格。 在许多情况下,它有效 但有时在 cookTriangleMesh 中 在客户端.exe的 0x00007FFD322F259E (PhysXCooking_64.dll) 引发异常: 0xC0000005:访问冲突读取位置0x0000019F69AA8000。 发生。

我担心缓冲区的容量,给了他 1.5 倍的空间,我检查了 ((physx::P xSimpleTriangleMesh)&meshDesc),nd {points={count=82772 } triangles={count=43798 } flags={mBits=0 } } writeBuffer.mBuffer.capacity() 2278260 这两个人总是一样,要么成功,要么失败。

所以我不知道问题出在哪里。知道问题以及如何解决它的人可以帮助我吗?

C++ C++17 DirectX-11 Assimp PhysX

评论


答:

0赞 KimKulling 10/13/2023 #1

这不是与 Assimp 有关的问题。我检查了 Physix-API,我想知道您为什么要计算初始大小。

在此示例中,未初始化 writebuffer: Physix 示例

也许这对您来说是一个选择?我强烈建议使用验证方法来获取有关您的问题的更多信息:

#ifdef _DEBUG
    // mesh should be validated before cooked without the mesh cleaning
    bool res = theCooking->validateTriangleMesh(meshDesc);
    PX_ASSERT(res);
#endif

PxTriangleMesh* aTriangleMesh = theCooking->createTriangleMesh(meshDesc,
thePhysics->getPhysicsInsertionCallback());

希望这能有所帮助。