所以我有一个用于 fps 游戏的玩家控制器,它根据键盘输入向动态炮体施加力。玩家身体上的angularDampining=1。 playercontroller 类同时采用玩家类(它扩展了炮体类)和THREE.js 相机,keyboardContorls 方法在主脚本的 animate 函数中调用。世界重力设置为-20
export class PlayerController {
private player: Player;
private camera: THREE.PerspectiveCamera;
private cameraControls: PointerLockControls;
private keys: { [key: string]: boolean } = {};
constructor(player: Player, camera: THREE.PerspectiveCamera) {
this.player = player;
this.camera = camera;
this.cameraControls = new PointerLockControls(this.camera, document.body);
document.addEventListener("click", () => {
this.cameraControls.lock();
document.addEventListener("keydown", (event) => {
this.keys[event.key] = true;
});
document.addEventListener("keyup", (event) => {
this.keys[event.key] = false;
});
});
}
keyboardControls() {
this.camera.position.x = this.player.position.x;
this.camera.position.y = this.player.position.y + 1.5;
this.camera.position.z = this.player.position.z;
const velocity = new CANNON.Vec3(0, 0, 0);
const quaternion = this.cameraControls.getObject().quaternion;
const forwardVector = new THREE.Vector3(0, 0, -1).applyQuaternion(
quaternion
);
if (this.keys["w"] || this.keys["W"]) {
velocity.x = forwardVector.x * this.player.moveSpeed;
velocity.z = forwardVector.z * this.player.moveSpeed;
}
if (this.keys["s"] || this.keys["S"]) {
velocity.x = -forwardVector.x * this.player.moveSpeed;
velocity.z = -forwardVector.z * this.player.moveSpeed;
}
if (this.keys["a"] || this.keys["A"]) {
const rightVector = forwardVector
.clone()
.applyAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2);
velocity.x = velocity.x + rightVector.x * this.player.moveSpeed;
velocity.z = velocity.z + rightVector.z * this.player.moveSpeed;
}
if (this.keys["d"] || this.keys["D"]) {
const leftVector = forwardVector
.clone()
.applyAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 2);
velocity.z = velocity.z + leftVector.z * this.player.moveSpeed;
velocity.x = velocity.x + leftVector.x * this.player.moveSpeed;
}
if (this.keys[" "]) {
if (this.player.getJump() === false) {
this.player.setJump(true);
}
}
if (this.player.velocity.y < 0) {
this.player.velocity.x = velocity.x;
this.player.velocity.z = velocity.z;
} else {
his.player.velocity.copy(velocity)
}
}
}
当给予键盘输入时,玩家身体沿着 x、y 和 z 精细移动,除非它沿着 x 和 z 轴移动,它会在 y 轴上弹跳。地面只是一个旋转90度的盒子体。任何完全消除这种弹跳的帮助将不胜感激
我向玩家身体及其相互作用的身体添加了一种材质,以消除摩擦