将 btSoftBodyHelpers::CreateFromTriMesh 与 trimesh 一起使用

Posted

技术标签:

【中文标题】将 btSoftBodyHelpers::CreateFromTriMesh 与 trimesh 一起使用【英文标题】:Using btSoftBodyHelpers::CreateFromTriMesh with trimesh 【发布时间】:2014-11-24 14:47:02 【问题描述】:

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

我现在一直在尝试实现软体。 正如我所提到的,我确实有三角形,我想我可以重新使用三角测量代码来 使用函数创建软体对象:

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

我用硬编码的兔子网格成功地做到了这一点,但现在我想将任何三角网格插入到这个函数中。 但是我有点不知所措,不知道要发送哪些参数(如何从我的三角网格中获取正确的参数)。

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

btTriangleMesh *mTriMesh = new btTriangleMesh();

类型对象? )

它确实适用于项目符号具有的预定义类型形状,所以我的更新循环和所有这些都可以正常工作。

【问题讨论】:

【参考方案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->InternalProcessAllTriangles() 迭代网格,但这会使你的网格变成汤。

【讨论】:

以上是关于将 btSoftBodyHelpers::CreateFromTriMesh 与 trimesh 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?

如何将CMD窗口背景改成透明?