Three.js PointerLockControls和Physisjs碰撞检测

时间:2016-11-24 00:02:28

标签: javascript three.js physijs

我正在使用PointerLockControls(full modified code)处理Three.js项目。我想为playehr实现碰撞检测。我通过制作一个新的Physijs圆柱体对象,然后将它与相机一起传递给PointerLockControls来解决这个问题:

  var player = new Physijs.CylinderMesh( new THREE.CylinderGeometry( 2, 2, 10, 32) , playerMaterial );
  player.position.set(0, 5, 0);
  player.addEventListener( 'collision', handleCollision );
  scene.add(player);

  controls = new PointerLockControls( camera, player );

在PointerLockControls中,我将外部对象(偏航旋转处理程序)附加到传递的玩家对象,然后移动世界中的玩家对象。

velocity.x -= velocity.x * 10 * dt;
velocity.z -= velocity.z * 10 * dt;
velocity.y -= 9.8 * 20 * dt;

if (moveForward) velocity.z -= 180 * dt;
if (moveBackward) velocity.z += 180 * dt;
if (moveLeft) velocity.x -= 180 * dt;
if (moveRight) velocity.x += 180 * dt

player.translateX( velocity.x * dt );
player.translateY( velocity.y * dt );
player.translateZ( velocity.z * dt);

然而,在测试时,玩家对象和相机通过地板相位,或者,如果translateY被注释掉,当我试图移动它们时,什么都不做,只是急剧地振动。

我在哪里设置错误?在我看来,问题来自于将yawObject附加到玩家对象然后以正确的方式移动到我的设置进行碰撞检测?

1 个答案:

答案 0 :(得分:0)

找到我自己的问题的答案: Physijs不支持three.js样式对象操作。如果我们想像我在代码中那样使用translate(),我们需要像这样更新对象的脏位置参数:

player.translateX( velocity.x * dt );
player.translateY( velocity.y * dt );
player.translateZ( velocity.z * dt );
player.__dirtyPosition=true;

以上将使运动发挥作用。