Three.js PointerLockControls和Physisjs碰撞检测

3
我正在进行一个使用PointerLockControls(完整修改代码)的Three.js项目。我想为玩家实现碰撞检测。我通过制作一个新的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 );

在指针锁定控件中,我将外部对象(偏航旋转处理器)附加到传递的玩家对象上,然后将玩家对象在世界中移动。
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
找到了自己的答案: Physijs 不支持 three.js 样式的对象操纵。如果我们想像我在代码中所做的那样使用 translate(),我们需要更新对象的脏位置参数,方法如下:
player.translateX( velocity.x * dt );
player.translateY( velocity.y * dt );
player.translateZ( velocity.z * dt );
player.__dirtyPosition=true;

以上代码将使移动操作正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接