【问题标题】:Three.js PointerLockControls and Physisjs collision detection三.js PointerLockControls 和 Physisjs 碰撞检测
【发布时间】:2016-11-24 00:02:27
【问题描述】:

我正在使用 PointerLockControls (full modified code) 开发 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 );

在 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 附加到玩家对象,然后移动它,甚至是正确的方法来使用我的设置进行碰撞检测?

【问题讨论】:

    标签: javascript three.js physijs


    【解决方案1】:

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

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

    以上将使运动起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2013-12-05
      • 2011-09-05
      相关资源
      最近更新 更多