围绕Y轴的三个相机旋转似乎关闭

时间:2017-05-03 14:55:37

标签: javascript math three.js rotation

我们正在使用three.js进行VR / Stereoscopic Web应用程序,我们希望显示相机所在的角度。

实施例: 我们有一个“房间”设置。相机位于中央,此时相机的旋转与轨道控件相连。

# create a camera and place it in the scene
camera = new THREE.PerspectiveCamera(90, 1, 0.1, 2000);
camera.position.set(0, 35, 60);
# Attach Orbital controls
controls = new THREE.OrbitControls(camera, element);
controls.target.set(camera.position.x + 0.1, camera.position.y, camera.position.z);
controls.enableZoom = true;
controls.enablePan = true;
# Attach DeviceOrientationControls
controls = new THREE.DeviceOrientationControls(camera, true);
controls.connect();
controls.update();

现在,在每次animationFrame调用期间,我们都会检查相机的矢量:

vector = camera.getWorldDirection();
theta = Math.atan2(vector.x, vector.z);
phi = Math.sqrt((vector.x * vector.x) + (vector.z * vector.z));
pitch = Math.atan2(phi, vector.y);

期待以下弧度:

  • theta是远离原始视图方向(Z)的旋转,就像从(Y)轴向下看一样。 (想想相机下面的地面上的时钟)
  • Phi将是从原始视图方向(z)向上或向下的高程。 (想想相机侧面的时钟。)
  • 当俯视原始Z向量时,俯仰将围绕Z轴旋转。 (想想相机背面的时钟。)

然而,Theta似乎始终是一个因素。 Phi和Pitch似乎没问题。 我们通过例如pitch * (180/Math.PI)

将弧度转换为度数

世界和相机本身似乎更新并旋转得很好,向左或向右旋转手机/ VR眼镜似乎产生并自然“环顾房间”运动。

通过一次检查一个轴上的旋转来完成这些测量,并且主要是保持另外两个面向原始方向。

我们缺少什么?

2 个答案:

答案 0 :(得分:1)

所以,我们设法深入研究了这一点。我们建立了一个cnc旋转台,并测量了手机上的角度,并与我们给计算机控制旋转台的输入进行了比较。

结论:Chrome是一块垃圾。它不能也不会产生甚至几乎有用的数据。它也不会在可重复的范围内产生任何东西。

同一部手机上的Firefox有一些问题,在某些时候翻转轴(可能是万向节锁相关或由于旋转溢出超过360度),但设法非常靠近我们的输入(低于1%的折扣)并且是超级可靠,可重复。

答案 1 :(得分:0)

您可以致电camera.getWorldRotation()获取euler角度。