这个问题让我很困扰。
我正在尝试根据鼠标输入实现炮弹身体的旋转。
使用(Cannon)Three FPS示例来演示,您可以看到问题所在。
如何解决这样的问题?也许我在其他地方做错了什么,可能会影响四元数?
也许我应该提到,在playercontroller(pl.js)中,我将旋转应用于sphereBody,而不是yaw-和pitchObjects。
来自pl.js的相关代码(第49行):
https://codepen.io/Raggar/pen/EggaZP https://github.com/RaggarDK/Baby/blob/baby/pl.js
当您运行代码并通过单击“单击播放”区域启用pointerlockcontrols,并按下W键1秒钟使球进入相机视野时,您将看到球根据WASD键应用速度移动。如果移动鼠标,则四元数将应用于Body,并计算正确的速度。 现在转180度,X轴上的旋转现在以某种方式被否定了。 当向上移动鼠标时,球体向下旋转。如何解决这样的问题?也许我在其他地方做错了什么,可能会影响四元数?
也许我应该提到,在playercontroller(pl.js)中,我将旋转应用于sphereBody,而不是yaw-和pitchObjects。
来自pl.js的相关代码(第49行):
var onMouseMove = function ( event ) {
if ( scope.enabled === false ) return;
var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
cannonBody.rotation.y -= movementX * 0.002;
cannonBody.rotation.x -= movementY * 0.002;
cannonBody.rotation.x = Math.max( - PI_2, Math.min( PI_2, cannonBody.rotation.x ) );
//console.log(cannonBody.rotation);
};
并且(第174行):
euler.x = cannonBody.rotation.x;
euler.y = cannonBody.rotation.y;
euler.order = "XYZ";
quat.setFromEuler(euler);
inputVelocity.applyQuaternion(quat);
cannonBody.quaternion.copy(quat);
velocity.x = inputVelocity.x;
velocity.z = inputVelocity.z;
在animate()
函数内,CodePen的代码(第305行):
testballMesh.position.copy(sphereBody.position);
testballMesh.quaternion.copy(sphereBody.quaternion);