Cannon-js。当力施加到 x 和 z 轴时,动态主体在 y 轴上弹跳

问题描述 投票:0回答:1

所以我有一个用于 fps 游戏的玩家控制器,它根据键盘输入向动态炮体施加力。玩家身体上的angularDampining=1playercontroller 类同时采用玩家类(它扩展了炮体类)和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度的盒子体。任何完全消除这种弹跳的帮助将不胜感激

javascript typescript three.js cannon.js
1个回答
0
投票

我向玩家身体及其相互作用的身体添加了一种材质,以消除摩擦

© www.soinside.com 2019 - 2024. All rights reserved.