Babylon.js OnIntersectionEnterTrigger 没有用相机触发

Babylon.js OnIntersectionEnterTrigger not triggering with camera

我正在使用 Babylon.js 2.4.0

我有一个从 .obj 文件加载的网格(沙发形状),以及这样设置的相机:

let camera = new BABYLON.FreeCamera('camera1', new BABYLON.Vector3(0, 2, 0), scene);

camera.checkCollisions = true;
camera.applyGravity = true;
camera.ellipsoid = new BABYLON.Vector3(1, 1, 1);
camera.attachControl(canvas, false);
camera.speed = 0.5;
camera.actionManager = new BABYLON.ActionManager(scene);

我想设置一个事件,以便当我走过沙发时,"intersection" 会记录到控制台:

let action = new BABYLON.ExecuteCodeAction(
  { trigger: BABYLON.ActionManager.OnIntersectionEnterTrigger, parameter: { mesh: couchMesh }},
  (evt) => {
    console.log("intersection");
  }
);

this.camera.actionManager.registerAction(action);

当我穿过网格时,控制台上没有任何记录。

我在 Babylon.js Playground 上创建了一个示例,使用他们提供的示例来检查我的网格或相机设置是否有问题,而且它似乎不是 (操场也不行)。

Babylon.js中的相机没有动作管理器,所以即使你设置了它也不会真正起作用。

要使用动作管理器使其工作,您可以在相机周围定义一个不可见的框,具有预定义的大小并将动作管理器附加到创建的网格。然后将网格的父级设置为相机,就完成了。这是您进行这些更改后的游乐场 - http://www.babylonjs-playground.com/#KNXZF#3

另一个解决方案是使用babylon js的内部碰撞系统,并设置相机的onCollide函数来实际做一些事情:)这是一个例子- http://www.babylonjs-playground.com/#KNXZF#4

请注意,在第二个游乐场中,相机不会穿过盒子,因为碰撞系统阻止它这样做。我不确定你的用例,所以很难说两者中哪一个会更好。

如果您需要 "gate" 系统(例如,知道玩家何时穿过大门),请使用第一种方法。第二个更干净,但也有缺点。