使用btSoftBodyHelpers :: CreateFromTriMesh和trimesh

时间:2014-09-30 04:44:30

标签: bullet bulletphysics

我一直试图在我的项目中获得对软体的支持, 我已经添加了所有基元,包括静态三角网格,如下所示:

enter image description here 我现在一直在努力实施软体。 我提到的确有三角形状,我想我可以重新使用三角测量代码 使用函数创建softbody对象:

btSoftBody* psb = btSoftBodyHelpers::CreateFromTriMesh(.....);

我成功地使用硬编码的兔子网格做了这个,但现在我想在这个函数中插入任何三角网格。 但我有点迷失了确切的发送参数(如何从我的三角网格中获取正确的参数)。

你们中有人有这方面的例子吗? (不是硬编码的,而是来自

btTriangleMesh *mTriMesh = new btTriangleMesh();

类型对象? )

它确实适用于子弹具有的预定义类型形状,因此我的更新循环和所有工作正常。

1 个答案:

答案 0 :(得分:1)

这适用于版本2.81(假设顶点存储为PHY_FLOAT,索引存储为PHY_INTEGER):

btTriangleMesh *mTriMesh = new btTriangleMesh();

// ...

const btVector3 meshScaling = mTriMesh->getScaling();

btAlignedObjectArray<btScalar> vertices;
btAlignedObjectArray<int> triangles;

for (int part=0;part< mTriMesh->getNumSubParts(); part++)
{
    const unsigned char * vertexbase;
    const unsigned char * indexbase;

    int indexstride;
    int stride,numverts,numtriangles;
    PHY_ScalarType type, gfxindextype;

    mTriMesh->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);

    for (int gfxindex=0; gfxindex < numverts; gfxindex++)
    {
        float* graphicsbase = (float*)(vertexbase+gfxindex*stride);
        vertices.push_back(graphicsbase[0]*meshScaling.getX());
        vertices.push_back(graphicsbase[1]*meshScaling.getY());
        vertices.push_back(graphicsbase[2]*meshScaling.getZ());
    }

    for (int gfxindex=0;gfxindex < numtriangles; gfxindex++)
    {
        unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
        triangles.push_back(tri_indices[0]);
        triangles.push_back(tri_indices[1]);
        triangles.push_back(tri_indices[2]);
    }
}

btSoftBodyWorldInfo worldInfo;

// Setup worldInfo...
// ....

btSoftBodyHelper::CreateFromTriMesh(worldInfo, &vertices[0], &triangles[0], triangles.size()/3 /*, randomizeConstraints = true*/);

一种更慢,更通用的方法是使用mTriMesh-&gt; InternalProcessAllTriangles()迭代网格,但这会使你的网格成为汤。