【问题标题】:WebGL/OpenGL: Rotate camera according to device orientationWebGL/OpenGL:根据设备方向旋转相机
【发布时间】:2012-08-05 06:39:27
【问题描述】:

我有一个网络应用程序,我试图在 3D 空间中显示地图图像平铺平面。

我希望平面始终保持水平,但设备旋转,最终效果类似于this marine compass demo

我现在可以通过用于移动设备的 W3C 设备方向 API 捕获设备方向,并且我成功地渲染了地图图像图块。

我的问题是我缺乏如何根据设备方向正确旋转相机的基本数学知识。

我正在使用 Three.js 库。我试图直接通过 alpha/beta/gamma(转换为弧度)设置相机对象的旋转。但它不起作用,因为相机似乎总是根据 openGL/webGL 使用的世界轴而不是根据其本地轴旋转。

我想到了将相机前面的点旋转 100 个单位,并通过设备方向 API 提供的角度相对于相机位置旋转该点。但我也不知道如何实现。

谁能帮我实现我想要实现的目标?

编辑:

错误更正:

对于任何有兴趣实现类似事情的人,我发现 Three.js 对象默认使用本地空间轴,而不是世界空间轴,我错了。虽然官方文档声明通过设置“object.matrixAutoUpdate = false”然后修改“object.matrixWorld”并调用“object.updateWorldMatrix()”,您可以手动移动/旋转/缩放世界轴上的对象。但是当对象有父对象时它不起作用,当对象有父对象时将始终使用局部轴矩阵。

【问题讨论】:

    标签: opengl-es webgl three.js


    【解决方案1】:

    根据 W3C 设备方向事件规范,角度 alphabetagamma 形成一组 Z-X'-Y'' 类型的固有 Tait-Bryan 角度。

    Three.js 相机也会根据固有角度旋转。然而,应用旋转的默认顺序是:

    camera.rotation.order = 'XYZ'.
    

    那么,你需要做的是设置:

    camera.rotation.order = 'ZXY'; // or whatever order is appropriate for your device
    

    然后您可以像这样设置相机旋转:

    camera.rotation.x = beta * Math.PI / 180;
    camera.rotation.y = gamma * Math.PI / 180;
    camera.rotation.z = alpha * Math.PI / 180;
    

    免责声明:我没有您的设备类型。这是基于我对 three.js 的了解的有根据的猜测。

    编辑:更新为 three.js r.65

    【讨论】:

    • 这很有帮助,我昨晚在github上的three.js问题中发现了相同的结论,它解决了我的问题。谢谢!
    • 我试验并阅读了这篇关于 deviceorientation API html5rocks.com/en/tutorials/device/orientation 的精彩文章;我发现 deviceorientation API 是在 eulerOrder "YZX" 中实现的,因为它首先检测设备水平朝向的方向,然后是 font-back 倾斜,然后是左右倾斜;我在 Opera Mobile 12 上对此进行了测试,命令“YZX”有效,但“ZXY”无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-03-18
    • 2017-06-07
    相关资源
    最近更新 更多