在Three.js中根据方向和摄像机位置旋转,移动和缩放对象

时间:2017-01-23 09:26:53

标签: javascript math matrix three.js rotation

我正在为Three.js编写基本编辑器。我希望能够旋转,移动和缩放对象。

使用基本功能可以正常工作,但有时会有点混乱。

cube.rotation.z = Math.PI * val;
cube.rotation.x = Math.PI * val;
cube.position.z = val * -1;
cube.scale.y = val;

我想要做的是沿一个方向而不是一个轴并从相机的角度旋转对象。

这是一个说明这一点的代码。 https://codepen.io/arpo/pen/LxyoRJ

只要其他输入不受影响,它就可以正常工作。 如果你拖动范围"向左旋转"它在z轴上旋转立方体。但是如果你拖动范围"旋转后面"一路向右,然后拖动'#34;向左旋转"再次,旋转看起来像在Y轴上。其他输入也是如此。

我明白为什么会发生这种情况,但我不知道如何获得理想的效果。我也希望这可以从相机的角度来看。因此,如果您将相机向左移动并拖动范围"向后移动"立方体应该移开或靠近。

所以我想要的是当你使用左/右旋转范围旋转立方体时,我希望它从用户的角度向左或向右摆动。如果您使用移开范围,我希望将立方体推离用户。

1 个答案:

答案 0 :(得分:2)

您的问题的答案至少需要基本了解3D中的坐标系如何工作。您需要了解三个坐标系:

  1. 本地:场景中的每个对象都有自己的坐标系。一组3个不可见的轴,它们以对象为中心,无论您应用何种转换,始终指向对象的相同部分。
  2. 全局:也称为世界坐标,场景具有全局坐标系,用于描述场景中对象的位置。演示中的两条红线是X和Z全局坐标轴。
  3. 相机:相机有自己的坐标系。同样,这些是3个不可见的轴,一个指向左,一个指向上方,一个指向场景。
  4. 这三个坐标系未对齐。好吧,默认情况下它们是对齐的,但在旋转对象或相机后却没有对齐。

    当您通过rotation属性旋转对象时,您将围绕其局部轴旋转它。您的立方体的Z轴与世界Z轴相同。将其描绘为从其正面突出的线与全局红线对齐。然后将立方体旋转90度,然后再回到前面。它的Z轴现在朝下。

    当然,你从左到右'旋转 - 实际上是Z轴旋转 - 现在围绕这个朝下的Z轴旋转立方体。

    为了围绕与摄像机坐标系对齐的轴旋转立方体,您必须执行多次旋转和平移变换。

    我建议稍微学习一下3D的坐标系,模型转换,视图转换和相关基础知识。否则一切都会让人感到困惑。