1

我有一个带有大网格的 three.js 场景作为我的地图(从搅拌机中导出)。

我这样加载它:

// map
var loader = new THREE.JSONLoader(true);
var thiz = this;
loader.load(
    "iceworld.js"
    , function(geometry, materials) {
        materials[0].side = THREE.DoubleSide;
        var faceMaterial = new THREE.MeshLambertMaterial( materials[0] );
        //var faceMaterial = new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'ice.jpg' ), side: THREE.DoubleSide } );

       mesh = new THREE.Mesh( geometry, faceMaterial );
       thiz.scene.add( mesh );
     }
);

我使用PointerLockControls. 现在我可以穿过地图的墙壁,因为没有碰撞检测。

我该如何实施?我在示例和文档中没有找到解决方案。

4

1 回答 1

2

Three.js 是一个图形渲染库,不涉及碰撞检测。你需要一些不同的东西。这里有几个选项:

  • 如果您的场景大部分是平面和矩形的,即即使它是 3d,玩家也只能在一个具有简单形状的墙壁的 2d 平面上行走,您可以创建一个简单的网格来标记障碍物的位置,然后根据网格并取消移动,如果它最终在墙内。
  • 使用物理引擎:Physijs是 Three.js 的易于使用且灵活的 Bullet 动态引擎包装器。您可以将场景网格包裹在单个Physijs.ConcaveMesh中,为您的相机添加碰撞形状并进行即时、准确的碰撞检测 - 但如果您有一个相当复杂的场景,这会很慢。
  • 更好的方法是将场景分解为离散对象,例如矩形墙部分,并为它们单独添加廉价的碰撞形状(如立方体、球体、圆柱体)。Physijs 可以做到这一点,然后是cannon.js请参阅此处的 FPS 演示)。
  • 滚动您自己的碰撞检测。我真的不推荐这个,因为它是一个兔子洞,但它可以让你完全控制哪些功能、准确性和性能权衡对你来说是完美的。

就个人而言,我用 Three.js 创建了一个 FPS 游戏。我的关卡设计非常规则,所以我可以使用网格方法来处理玩家碰撞,但我还想要动态对象(例如桶、盒子等),并且使用 Physijs 让我可以轻松地集成它们。因此,通过将 Physijs 立方体创建到墙壁部分来处理墙壁碰撞。

于 2012-12-20T07:37:52.427 回答