来自three.js中的网格的bullet / ammo.js中的刚体(形状)

时间:2016-09-11 22:58:51

标签: three.js physics bulletphysics ammo.js

我正在使用带有three.js的bullet / ammo.js。我有一个3d网格,我想用一个柔软的身体使用确切的形状进行碰撞检测。有没有办法可以从一个网格(三个.js)中创建一个3d刚体(在子弹中)?

这是一个例子: http://kidzinski.com/miamisura/lazy3d/(请等待一秒钟以下载3D模型)。我有一块布在3d身上,我需要模拟这块布与身体的碰撞。

如果我从根本上误解了某些内容,我对这些框架不熟悉。

2 个答案:

答案 0 :(得分:3)

看起来你可以做一些工作来将任意的Three.js网格变成Bullet凹网格。这是由Physi.js支持的,它是一个即插即用的解决方案,可以将Three.js直接链接到ammo.js.我个人不建议使用该项目(Physi.js),但您可以查看源代码以了解它们如何实现凹网格。

首先,它们遍历几何体以在these lines of physi.js上创建“三角形”数据对象的自定义列表

for ( i = 0; i < geometry.faces.length; i++ ) {
    face = geometry.faces[i];
    if ( face instanceof THREE.Face3) {
        triangles.push([
            ...

然后将这些三角形传递给Ammo.js以制作new Ammo.btBvhTriangleMeshShape on these lines

for ( i = 0; i < description.triangles.length; i++ ) {
    ...
    triangle_mesh.addTriangle( _vec3_1, _vec3_2, _vec3_3, true );
}

...

shape = new Ammo.btBvhTriangleMeshShape( triangle_mesh, true, true );

这应该是构建自己的Ammo.js自定义网格的良好起点。

答案 1 :(得分:0)

Web上有很多线程,Physijs Concave网格不能用于压缩。似乎btBvhTriangleMeshShape不打算在ammo.js中使用collission,因为我发现在子弹相关论坛中搜索该主题。

对我有用的是btConvexHullShape:

var triangle, triangle_mesh = new Ammo.btTriangleMesh;
var btConvexHullShape = new Ammo.btConvexHullShape();
var _vec3_1 = new Ammo.btVector3(0,0,0);
var _vec3_2 = new Ammo.btVector3(0,0,0);
var _vec3_3 = new Ammo.btVector3(0,0,0);
for ( i = 0; i < triangles.length; i++ ) {
    triangle = triangles[i];
    _vec3_1.setX(triangle[0].x);
    _vec3_1.setY(triangle[0].y);
    _vec3_1.setZ(triangle[0].z);
    btConvexHullShape.addPoint(_vec3_1,true);
    _vec3_2.setX(triangle[1].x);
    _vec3_2.setY(triangle[1].y);
    _vec3_2.setZ(triangle[1].z);
    btConvexHullShape.addPoint(_vec3_2,true);
    _vec3_3.setX(triangle[2].x);
    _vec3_3.setY(triangle[2].y);
    _vec3_3.setZ(triangle[2].z);
    btConvexHullShape.addPoint(_vec3_3,true);
    triangle_mesh.addTriangle(
        _vec3_1,
        _vec3_2,
        _vec3_3,
        true
    );
}
return btConvexHullShape;

在使用threejs学习基于物理的3d的过程中,我还想提到以下最佳实践:使用复杂模型时,创建一个低多边形模型,可以推送到转换器函数而不是原始模型,或者会遇到堆栈溢出。