如何在 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 这样的库来帮助您。
我正在尝试使用从 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 这样的库来帮助您。