我正在使用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);
但是,在测试时,播放器对象和摄影机都穿过地板,或者,如果注释了transformY,则在我尝试移动它们时只能做些振动。
我在哪里设置错误?在我看来,问题出在将yawObject附加到播放器对象上,然后移动即使是正确的方法来进行我的设置中的碰撞检测?
最佳答案
找到了我自己的问题的答案:
Physijs不支持Three.js样式对象操纵。如果要像在代码中那样使用translate(),则需要更新对象的脏位置参数,如下所示:
player.translateX( velocity.x * dt );
player.translateY( velocity.y * dt );
player.translateZ( velocity.z * dt );
player.__dirtyPosition=true;
以上将使 Action 起作用。