Three.JS FPS控制左右排队

我正在设置一个简单的演示来测试FPS的播放器控件。 我有鼠标旋转相机,玩家可以使用QASD移动。 我的问题是,我需要让玩家能够相对于相机朝向的方向左右移动的算法是什么? 向前和向后移动的控制很好,但是我试图让左右移动工作时遇到了麻烦。

我正在使用THREE.JS和PhysiJS(物理引擎)。

下面是我的代码片段...

// the direction the camera is pointing in
var cameraLookVector = this.controls.getDirection(this.vDirection);         

// Player Movement
this.v = new THREE.Vector3(0,0,0);
if(keyboard.pressed("W")) { // Move forward
    this.v.x -= cameraLookVector.x * (Player.SPEED * delta * this.q); // works great
    this.v.z -= cameraLookVector.z * (Player.SPEED * delta * this.q);
}
if(keyboard.pressed("A")) { // Move left
    // Sets position relative to the world and not the direction the camera is facing
    this.v.x -= Player.SPEED * delta * this.q;
    /* Tried this but it didn't work
    this.v.x -= Math.cos(cameraLookVector * (Math.PI/180)) * (Player * delta * this.q);
    this.v.z -= Math.sin(cameraLookVector * (Math.PI/180)) * (Player * delta * this.q);
    */
}
if(keyboard.pressed("S")) { // Move backward
    this.v.x -= cameraLookVector.x * (Player.SPEED * delta * this.q); // works great
    this.v.z -= cameraLookVector.z * (Player.SPEED * delta * this.q);
}
if(keyboard.pressed("D")) { // Move right
    // Sets position relative to the world and not the direction the camera is facing
    this.v.x += Player.SPEED * delta * this.q;
}

this.bodyMesh.setLinearVelocity(this.v);

左侧和右侧的控件设置玩家相对于世界的位置。 例如,如果我按住'A',播放器将开始移动到屏幕的左侧,但如果我用鼠标旋转相机,播放器将移动到屏幕中。 我希望玩家的左右位置相对于摄像机的方向更新,所以从玩家的角度来看,他们总是左右晃动。

感谢您的任何帮助!


在左或右方向上计算向量的计算量较小的方法是使用cameraLookVector和常量“向上”方向的叉积。 这假定cameraLookVector永远不会与此“向上”平行。

跨产品图

在这张图片中,我们可以选择b向量作为摄影机的方向, a是一个常量向上, axb是一个非单位向量。

var vectorUp = new THREE.Vector3(0, 1, 0);


// Left vector
var coefficient = Player.SPEED * delta * this.q;

this.v.copy(new THREE.Vector3().crossVectors(vectorUp, cameraLookVector).normalize().multiplyScalar(coefficient));

做到这一点的方法是创建一个新的Vector3并根据camera的旋转进行转换,我假设您可以通过编程方式进行访问。

var coefficient = Player.SPEED * delta * this.q;

// Right vector
this.v.copy(new THREE.Vector3(1, 0, 0).applyQuaternion(camera.quaternion).multiplyScalar(coefficient));
链接地址: http://www.djcxy.com/p/83219.html

上一篇: Three.JS FPS Controls Strafing Left and Right

下一篇: Three.js camera controls for space game