2017-05-03 59 views
2

我们正在做一个VR /立体Web应用程序与three.js我们想要显示相机的角度。three.js相机绕Y轴旋转似乎关闭

例如: 我们有一个“房间”设置。相机位于中心,此时相机的旋转与轨道控制器相连。

# 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); 

期待弧度如下:

  • 西塔从原来的视图方向是旋转远(Z),好像你会从(Y)轴向下看。 (想象在相机下面的地面上的时钟)
  • Phi将是从原始视图方向(z)向上或向下的仰角。 (想象一下相机侧面的时钟。)
  • 俯视原始Z向量时,会围绕Z轴旋转。 (想想照相机背面的时钟。)

但是,Theta似乎一直是一个因素。 Phi和Pitch似乎没问题。 我们做例如转换弧度到度:pitch * (180/Math.PI)

世界和相机本身似乎更新和转动得很好,旋转手机/ VR眼镜的左边或右边好像产生与周围的自然“寻找房间“运动。

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

我们缺少什么?

回答

0

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

结论:Chrome是一块废话。它不能也不会生成甚至接近有用的数据。它也不会在可重复的范围内产生任何东西。

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

0

您可以拨打camera.getWorldRotation()获取euler角度。