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中 Client.exe 中的 0x00007FFD322F259E (PhysXCooking_64.dll) 处引发异常:0xC0000005:读取位置 0x0000019F69AA8000 时发生访问冲突。 发生。
我担心buffer的容量,给了他1.5倍的空间,我查了一下 ((physx::PxSimpleTriangleMesh)&meshDesc),nd {points={count=82772 } 三角形={count=43798 } flags={mBits=0 } } writeBuffer.mBuffer.capacity() 2278260 这两个人无论成功还是失败总是一样的..
所以我不知道问题是什么。了解问题以及如何解决的人可以帮助我吗?
这不是与 Assimp 有关的问题。我检查了 Physix-API,我想知道为什么你要计算初始大小。
在此示例中,写入缓冲区未初始化: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());
希望对您有一点帮助。