我使用bullet/ammo.js与three.js。我有一个3d网格,我想使用精确的形状与柔软的身体碰撞检测。是否有一种方法,我可以创建一个3d刚体(子弹)从网格(在three.js)?
下面是一个例子:http://kidzinski.com/miamisura/lazy3d/(请稍候3d模型下载)。我有一块布落在一个3d物体上,我需要模拟这块布与物体的碰撞。
我是这些框架的新手,如果我从根本上误解了一些东西,请原谅。
看起来你可以做一些工作来把一个任意的Three.js网格变成一个Bullet凹网格。这是由physical .js支持的,它是一个即插即用的解决方案,可以将Three.js直接链接到amo .js。我个人不建议使用这个项目(physical .js),但你可以看看源代码,看看他们是如何实现凹网格的。
首先,在物理.js
这几行代码中循环遍历几何图形,创建一个自定义的"三角形"数据对象列表。for ( i = 0; i < geometry.faces.length; i++ ) {
face = geometry.faces[i];
if ( face instanceof THREE.Face3) {
triangles.push([
...
然后将这些三角形传递给amo .js以在这些行上创建new Ammo.btBvhTriangleMeshShape
:
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 );
这应该是构建自己的amo .js自定义网格的良好起点。
在web上有很多线程,即Physijs的凹网格不能与碰撞一起工作。似乎,btBvhTriangleMeshShape不打算在amo .js中使用碰撞,因为我发现在子弹相关论坛中搜索该主题。
对我有用的是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的过程中,我还想提到以下最佳实践:当使用复杂模型时,创建一个低多边形模型,您可以将其推送到该转换函数而不是原始模型,否则您将遇到堆栈溢出。