【发布时间】:2016-09-20 22:23:22
【问题描述】:
这个问题让我很烦。 我正在尝试根据鼠标输入实现 Cannon.Body 的旋转。 通过使用(Cannon)3 FPS 示例进行演示,您可以看到问题所在。
https://codepen.io/Raggar/pen/EggaZP https://github.com/RaggarDK/Baby/blob/baby/pl.js
当您运行代码并通过单击“单击播放”区域启用指针锁定控件并按 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);
【问题讨论】:
-
codepen 在 Chrome 中不起作用,因为 pl.js 没有正确的 mimetype。在这里修复它:codepen.io/anon/pen/PGGpLZ
标签: javascript three.js cannon.js