【问题标题】:Create CANNON.RigidBody from THREE.Mesh or THREE.Geometry从 THREE.Mesh 或 THREE.Geometry 创建 CANNON.RigidBody
【发布时间】:2016-10-15 03:33:58
【问题描述】:

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

// 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);
});

是否可以从THREE.Mesh (var castle) 或THREE.Geometry (var geometry) 对象创建CANNON.RigidBody另一种阅读方式是:如何自定义THREE.Mesh“solid”?

更新

我使用 Blender,用盒子创建了一座新城堡,并将 exported 转换为 Three.js 格式。如果将质量设置为 0CANNON.Body,则它保持静态。 This 完美解决了...

【问题讨论】:

标签: javascript three.js cannon.js


【解决方案1】:

我遇到了类似的问题,并使用这两个函数从 THREE.Geometry(此处称为 geometry)创建了必要的“点”和“面”(如 Cannon 文档中所述):

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]
})

【讨论】:

    【解决方案2】:

    这取决于模型的物理表示应该有多精确。我对 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

    希望这会有所帮助!

    【讨论】:

    • computeBoundingBoxcomputerBoundingSphere 在我的情况下不起作用。我希望玩家能够在城堡中行走、跳下楼梯等……就好像它是真实的一样。使用CANNON.ConvexPolyhedrons 创建CANNON.Compound 可以工作,但我必须更改my object file 的模式以匹配example's 的模式。我正在研究如何做到这一点。
    • 为了完整性/文档,我现在在答案中也提到了重铸。对某些人来说可能是一个不错的选择,甚至对你来说也可能
    • github.com/schteppe/cannon.js/issues/144 我碰巧在 cannon.js 找到了这个……他回答了你所有的问题,你还想要什么?他说 a)cannon.js 中不支持任意网格,b)你可能想用更小的物理块重建你的城堡(就像他展示的图像一样)。有种方法可以自动为任意网格创建物理场,但自己编写代码非常复杂。如前所述,Recast 在这个方向上做了一些事情。除此之外,我真的建议用原语重建你的城堡。
    • 是的,我打算用小块重建我的城堡,并将它们组合成一个THREE.Compound。谢谢你给我看兔子的例子,我完全忘记了。不幸的是,没有很多关于CANNON.Compound 的文档,但我会尝试使用它,甚至可能创建一个库来将自定义网格分解为原始形状,然后使用CANNON.Compounds 来重建它。当有突破发生时会更新这个问题。 :)
    • 只是更新:我使用 Blender 并用盒子创建了一座新城堡。如果您将CANNON.Body 的质量设置为 0,它会保持静态。 This 完美解决了...
    猜你喜欢
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2021-01-02
    相关资源
    最近更新 更多