我已經實作了一個threejs鍵盤控制功能,只要相機面向北方,東方或西方方向,當它轉向南方,東南或西南方向時,控制元件就會自行反轉
if(controls["KeyW"]){ // w
camera.position.x -= Math.sin(camera.rotation.y) * player.speed;
camera.position.z -= -Math.cos(camera.rotation.y) * player.speed;
}
if(controls["KeyS"]){ // s
camera.position.x = Math.sin(camera.rotation.y) * player.speed;
camera.position.z = -Math.cos(camera.rotation.y) * player.speed;
}
if(controls["KeyA"]){ // a
camera.position.x = Math.sin(camera.rotation.y Math.PI / 2) * player.speed;
camera.position.z = -Math.cos(camera.rotation.y Math.PI / 2) * player.speed;
}
if(controls["KeyD"]){ // d
camera.position.x = Math.sin(camera.rotation.y - Math.PI / 2) * player.speed;
camera.position.z = -Math.cos(camera.rotation.y - Math.PI / 2) * player.speed;
}
if(controls["Space"]) { // space
if(player.jumps) return false;
player.jumps = true;
player.velocity = -player.jumpHeight;
}
}
為了更好地幫助您理解我一直面臨的問題,這是我網站的鏈接,我的猜測是 sin 和 cos 在 180 次旋轉后會反轉它們的值
uj5u.com熱心網友回復:
好吧,我犯的錯誤是我使用指標控制元件進行滑鼠導航和鍵盤觸發器來移動,稍微挖掘了檔案并意識到我可以使用 PointerLockControls 的內置函式呼叫moveForward和moveRight
const mouseControls = new PointerLockControls(camera, renderer.domElement);
document.addEventListener( 'click', () => {
mouseControls.lock()
}, false)
const keysDown: any = {
"KeyW": 0,
"KeyA": 0,
"KeyS": 0,
"KeyD": 0,
}
document.addEventListener("keydown", ({ code }) => {
keysDown[code] = 1
})
document.addEventListener("keyup", ({ code }) => {
keysDown[code] = 0
})
function updateControls() {
const forwardDirection = keysDown["KeyW"] - keysDown["KeyS"];
const rightDirection = keysDown["KeyD"] - keysDown["KeyA"];
mouseControls.moveForward(forwardDirection * player.speed)
mouseControls.moveRight(rightDirection * player.speed)
}
////////main animation function
function animate() {
requestAnimationFrame( animate );
updateControls();
renderer.render( scene, camera );
};
animate();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/431633.html
標籤:javascript 数学 三.js 游戏物理 游戏开发
上一篇:如何讓程式理解輸入
