问题描述
我正在尝试使用从DeviceOrientationEvents
接收到的数据,通过使用三的DeviceOrientationControls
对Three.js中的摄像机进行动画处理(旋转)。这些控件会在每个动画帧上更新,并且一切都会按我预期的那样进行。但是,如果我开始滚动,则直到滚动的惯性完成之前,不会再触发DeviceOrientationEvent
。
我已经通过从DeviceOrientationEvent
处理程序中登录到控制台来确认在滚动过程中未触发(或至少未调度)这些事件。我可以看到事件定期触发,直到我开始滚动,然后停止,然后从滚动的惯性完成那一刻开始触发。
手动停止惯性中间滚动(通过触摸屏幕)也会导致deviceorientation
事件恢复。
我已在脚本中禁用了所有其他scroll
事件处理程序。我已经使所有触摸事件处理程序变为被动状态,也尝试使它们变为非被动状态,并且还尝试完全禁用脚本中的所有触摸事件处理程序。
到此为止,我相当确定,这可能是如何在浏览器中计划/排队滚动线程(与主线程分开运行)的处理和IMU数据的处理的函数。可能不是很好的解决方案,但是我在这里问的是如果我自己的故障排除中忽略了某些内容。这似乎与three.js或three.js中的DeviceOrientationControls
无关,但我将其标记为three.js,以防万一有人尝试类似操作时遇到此问题。 / p>
我在滚动时启用DeviceOrientationControls
的独特情况是,滚动驱动“摄影机”的动画(旋转和位置被动画化的空对象),而四处移动电话会旋转摄影机本身。 (有点像在乘坐火车时可以转过头看看。)
我的测试已经在装有iOS 13.5.1,iPhone iOS 84和Safari的IPhone 11 Pro上进行了。我尚未在Android上进行测试。
解决方法
iOS多年来一直在降低滚动期间的重复JavaScript功能。这是为了节省电池消耗,因为在滚动时必须重新渲染页面很多次,因此它将暂停其他辅助命令,直到滚动完成。 See here for more。
您可以创建自己的自定义滚动功能,而无需通过“ touchstart”和“ touchmove”捕获垂直滑动手势来实际向下滚动HTML页面。或者,您可以使用Hammer.js之类的库来帮助您。