我一直在玩 webGL,我已经达到了可以制作带有非常可怜的图形的小型 3D 游戏的地步(到目前为止,它更像是概念/功能的证明)。对于3D体验,任意方向无限移动鼠标,旋转第一人称摄像头,效果非常好。Pointerlock 允许我锁定和隐藏光标位置,这非常有帮助,但是我需要找到另一种跟踪鼠标移动的方法。在我的研究中,event.movementX
这event.movementY
似乎是标准,但我经常在鼠标移动的相反方向上出现大的移动(通常在 500 到 583 之间)。我用许多鼠标和触控板对此进行了测试,并遇到了同样的现象。
这是我的相关事件侦听器:
document.addEventListener("mousemove", function(event) {
xMovement += event.movementX;
yMovement += event.movementY;
console.log(event.movementX)
}, false);
document.addEventListener("pointerlockchange", function(event) {
if(pointerLockEnabled) pointerLockEnabled = false;
else pointerLockEnabled = true;
xMovement = 0; yMovement = 0;
} , false);
以及相关的渲染循环代码:
function render() {
if(pointerLockEnabled) {
camera.rotation.y = -xMovement / 1000;
camera.rotation.x = -yMovement / 1000;
if(rightKey && !leftKey) {
camera.position.x += 10 * Math.cos(camera.rotation.y);
camera.position.z -= 10 * Math.sin(camera.rotation.y);
}
else if(leftKey && !rightKey) {
camera.position.x -= 10 * Math.cos(camera.rotation.y);
camera.position.z += 10 * Math.sin(camera.rotation.y);
}
if(upKey&& !downKey) {
camera.position.z -= 10 * Math.cos(camera.rotation.y);
camera.position.x -= 10 * Math.sin(camera.rotation.y);
}
else if(downKey && !upKey) {
camera.position.z += 10 * Math.cos(camera.rotation.y);
camera.position.x += 10 * Math.sin(camera.rotation.y);
}
}
}
但是我的控制台出现了这样的情况:
我添加了更改条件xMovement
以防止摄像机角度发生大幅转动,但我仍然留下非常烦人的运动。有什么想法可以修补或替换为更无缝的界面移动吗?