这一个是很烦人的。 我正在尝试基于鼠标输入实现Cannon.Body的旋转。 通过使用(Cannon)Three FPS示例来演示,您可以看到问题所在。基于四元数的正确旋转炮身?
https://codepen.io/Raggar/pen/EggaZP https://github.com/RaggarDK/Baby/blob/baby/pl.js
当您运行的代码,并通过点击“点击播放”区域,按W 1秒钟让球进入相机的视野使pointerlockcontrols,你会看到通过施加速度球体根据WASD键移动。如果移动鼠标,则将四元数应用于Body,并计算适当的速度。 现在转动180度,X轴上的旋转现在以某种方式取消。 向上移动鼠标时,球体向下旋转。
如何解决此问题?也许我在其他地方做错了什么,这可能与四元数混乱?
也许我应该提到,在playercontroller(pl.js)中,我将旋转应用于sphereBody,而不是偏航和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;
里面的动画()函数,codepen(305线): testballMesh.position.copy(sphereBody.position); testballMesh.quaternion.copy(sphereBody.quaternion);
因为pl.js没有正确的mimetype,所以codepen在Chrome中不起作用。修正它在这里:https://codepen.io/anon/pen/PGGpLZ – schteppe