【问题标题】:Bullet: btBvhTriangleMeshShape crash项目符号:btBvhTriangleMeshShape 崩溃
【发布时间】:2014-08-04 22:02:54
【问题描述】:

所以我有这行代码:

new btBvhTriangleMeshShape(meshInterface, true);

这会导致我的程序崩溃。显然,函数内部的某处有一个 assert(numIndices>0) 行,这导致了崩溃。

如果我在行尾再添加一个false 参数,它看起来像:

new btBvhTriangleMeshShape(meshInterface, true, false);

我告诉它不要生成包围体数据,它继续正常(没有崩溃)。所以我的问题是:为什么当我在 meshInterface 中明确有索引时,它会崩溃并说我没有索引。

附加信息:

meshInterface 是这样创建的:

btTriangleMesh *meshInterface = new btTriangleMesh();
for(uint i = 0; i < terrainMesh.position.size(); i++) {
    //don't remove duplicate vertex because there won't ever be any
    meshInterface->findOrAddVertex(toBt(terrainMesh.position[i]), false);
}
for(uint i = 0; i < terrainMesh.index.size(); i++) {
    meshInterface->addIndex(terrainMesh.index[i]);
}

我已经在另一个对象中设置了我的数据,我只是将它加载到项目符号设置中。

在这里您可以看到我的meshInterface 中有明显有效的数据。网格是一个平面。

【问题讨论】:

    标签: c++ assertion bullet


    【解决方案1】:

    来自 btTriangleMesh.h:

    // findOrAddVertex is an internal method, use addTriangle instead
    int findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices);
    

    所以尝试使用 addTriangle。

    编辑:使用 btTriangleIndexVertexArray 代替 btTriangleMesh 效率更高。

    【讨论】:

    • 令我惊讶的是,它确实有效。但是,这是不必要的,我想找到一种方法让我的工作而不是作为一种解决方法。我已经按照子弹想要的方式设置了我的数据,并且使用您的技术,我将其转换为临时格式,然后子弹将其转换回我以前的方式。 TLDR:你的有效,但效率低。
    • addTriangle 的评论说最好直接使用 btTriangleIndexVertexArray。看起来 btTriangleIndexVertexArray 的构造函数会更有效,但您必须向 btTriangleMesh 添加一个构造函数,该构造函数采用正确的参数(也许还有另一种方法可以做到这一点?)。我还必须修改 btTriangleMesh 以按索引获取三角形。
    • 我会试试的,我过去出于某种原因拒绝使用btTriangleIndexVertexArray,但现在我不记得了。我认为由于它仍然是btStridingMeshInterface 的子类,因此我不需要对ctor 使用任何特殊技术。谢谢!
    • 哦,太好了。我假设 btBvhTriangleMeshShape 构造函数采用了 btTriangleMesh*,但我发现我错了。
    • 嗯,我已经使用btTriangleIndexVertexArray 让它运行良好,但我很确定数据搞砸了。我会弄清楚。但是说真的,我的上帝,为什么子弹必须如此低级!?他们不能只使用向量而不是原始指针吗?耶稣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多