bullet/ammo.js 中的刚性 body(形状)来自 three.js 中的网格
Rigid body (shape) in bullet/ammo.js from a mesh in three.js
我正在使用 bullet/ammo.js 和 three.js。我有一个 3d 网格,我想使用精确的形状通过软 body 进行碰撞检测。有没有一种方法可以从网格(在 three.js 中)创建 3d 刚性 body(在子弹中)?
这是一个例子:
http://kidzinski.com/miamisura/lazy3d/(3d模型下载请稍等)。我有一块布落在 3d body 上,我需要模拟这块布与 body.
的碰撞
我是这些框架的新手,如果我从根本上误解了某些东西,我深表歉意。
看来您可以做一些工作来将任意 Three.js 网格变成 Bullet 凹面网格。 Physi.js 支持,这是 link Three.js 直接到 ammo.js 的即插即用解决方案。我个人不建议使用该项目 (Physi.js),但您可以查看源代码以了解它们如何实现凹面网格。
首先,他们遍历几何以在 these lines of physi.js
上创建 "triangle" 数据对象的自定义列表
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 自定义网格的良好起点。
网络上有很多话题,Physijs 凹面网格不适用于碰撞。看来,btBvhTriangleMeshShape 不适用于 ammo.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学习physic based 3d的过程中,我还想提一下以下最佳实践:当使用复杂模型时,创建一个低多边形模型,你可以将其推送到那个转换器函数而不是原始模型,否则你会遇到堆栈溢出。
我正在使用 bullet/ammo.js 和 three.js。我有一个 3d 网格,我想使用精确的形状通过软 body 进行碰撞检测。有没有一种方法可以从网格(在 three.js 中)创建 3d 刚性 body(在子弹中)?
这是一个例子: http://kidzinski.com/miamisura/lazy3d/(3d模型下载请稍等)。我有一块布落在 3d body 上,我需要模拟这块布与 body.
的碰撞我是这些框架的新手,如果我从根本上误解了某些东西,我深表歉意。
看来您可以做一些工作来将任意 Three.js 网格变成 Bullet 凹面网格。 Physi.js 支持,这是 link Three.js 直接到 ammo.js 的即插即用解决方案。我个人不建议使用该项目 (Physi.js),但您可以查看源代码以了解它们如何实现凹面网格。
首先,他们遍历几何以在 these lines of physi.js
上创建 "triangle" 数据对象的自定义列表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 自定义网格的良好起点。
网络上有很多话题,Physijs 凹面网格不适用于碰撞。看来,btBvhTriangleMeshShape 不适用于 ammo.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学习physic based 3d的过程中,我还想提一下以下最佳实践:当使用复杂模型时,创建一个低多边形模型,你可以将其推送到那个转换器函数而不是原始模型,否则你会遇到堆栈溢出。