如何在 iOS 13 中将 DeviceOrientationControls 与滚动一起使用?

How can I use DeviceOrientationControls with scroll in iOS 13?

我正在尝试使用从 DeviceOrientationEvents 接收到的数据,使用三个 DeviceOrientationControls 为 three.js 中的相机设置动画(旋转)。控件在每个动画帧上更新,一切都如我所料。但是,如果我开始滚动,则不会再次触发 DeviceOrientationEvent,直到滚动的惯性完成。

我已通过从 DeviceOrientationEvent 处理程序中登录到控制台,确认在滚动期间不会触发(或至少不会分派)这些事件。我可以看到事件有规律地触发,直到我开始滚动,然后停止,然后从滚动惯性完成的那一刻起继续触发。

手动停止惯性滚动(通过触摸屏幕)也会导致 deviceorientation 事件恢复。

我已禁用脚本中的所有其他 scroll 事件处理程序。我已将所有触摸事件处理程序设为被动,也尝试将它们设置为非被动,并且还尝试在我的脚本中完全禁用所有触摸事件处理程序。

至此我相当确定这可能是浏览器中滚动线程的处理(与主线程分开运行)和 IMU 数据的处理方式 scheduled/queued 的函数,所以可能没有好的解决方案,但我在这里问一下,以防我在自己的故障排除中忽略了什么。这似乎不是 three.js 或 three.js 中的 DeviceOrientationControls 的问题,但我将其标记为 three.js 以防万一有人遇到过这个问题在尝试类似的事情时。

我在滚动时启用 DeviceOrientationControls 的独特情况是滚动会驱动“相机装置”(其旋转和位置已设置动画的空对象)的动画,同时移动 phone around 旋转相机本身。 (这有点像在有轨电车中移动时可以转头环顾四周。)

我的测试是在 IPhone 11 Pro、iOS 13.5.1、Chrome iOS 84 和 Safari 中进行的。我没有在 Android.

上测试过

iOS 多年来一直在滚动期间减慢重复性 JavaScript 功能。这是为了节省电池消耗,因为它在滚动时必须 re-render 页面很多次,所以它会暂停其他辅助命令,直到滚动完成。 See here for more.

您可以通过 'touchstart' 和 'touchmove' 捕获垂直滑动手势来创建自己的自定义滚动功能,而无需实际向下滚动 HTML 页面。或者您可以使用像 Hammer.js 这样的库来帮助您。