从THREE.Mesh或THREE.Geometry创建CANNON.RigidBody

时间:2014-07-03 01:47:27

标签: javascript three.js cannon.js

我正在使用THREE.Mesh对象创建THREE.JSONLoader对象,如下所示:

// Create castle.
loader.load('/Meshes/CastleTower.js', function(geometry, materials) {
    var tmp_material = new THREE.MeshLambertMaterial();
    THREE.ColorUtils.adjustHSV(tmp_material.color, 0, 0, 0.9);

    var castle = new THREE.Mesh(geometry, tmp_material);
    castle.scale.set(0.2, 0.2, 0.2);
    castle.rotation.setX(-Math.PI/2);
    scene.add(castle);
});

是否可以从CANNON.RigidBodyTHREE.Mesh)或var castleTHREE.Geometry)对象创建var geometry您可以阅读此内容的另一种方法是:如何使任何自定义THREE.Mesh“固定”?

更新

我使用了Blender,从盒子中创建了一个新城堡,并将exported创建为Three.js格式。如果您将质量设置为0的{​​{1}},则它仍然是静态的。 This完美地完成了......

2 个答案:

答案 0 :(得分:1)

这取决于你的模型的物理代表应该有多精确。我对cannon.js不太熟悉,但这里有一些我知道的选项:

  • 使用" computeBoundingBox"并在你的塔上创建一个带有那些边界的cannon.js框
  • 使用" computeBoundingSphere"以类似的方式
  • 将物理学用于凹(即任意)网格。这是性能最耗的方式。 Cannon.js在这里有一个例子:http://schteppe.github.io/cannon.js/demos/bunny.html

非cannon.js相关方法将是例如使用重播。 Recast会为您加载.obj文件,并根据您的设置为您创建导航网格。然后你可以在那里走动(如果你有像游戏一样的RTS鸟瞰图,或者跑来跑去的机器人,那就太棒了)。可以在此处找到重新构建的JavaScript端口:https://github.com/vincent/recast.js

希望这有帮助!

答案 1 :(得分:0)

我有一个类似的问题,并创造了必要的"点"和"面孔" (如Cannon文档中所述)来自THREE.Geometry(此处称为geometry),具有以下两个函数:

cannonPoints = geometry.vertices.map(function(v) {
    return new CANNON.Vec3( v.x, v.y, v.z )
})

cannonFaces = geometry.faces.map(function(f) {
    return [f.a, f.b, f.c]
})