如何平滑更改不会动画的 SCNCamera 的 FoV?
Posted
技术标签:
【中文标题】如何平滑更改不会动画的 SCNCamera 的 FoV?【英文标题】:How to smoothly change the FoV of an SCNCamera that won't animate? 【发布时间】:2020-01-10 12:49:52 【问题描述】:我有一个 SCNCamera 在 ios 上的 3D SceneKit 视图中工作。
当我改变屏幕的方向时,为了保持世界对象的大小和相对位置相同,我需要改变 SCNCamera 的 FoV。
但是,我无法为这种变化设置动画,因此当 FoV 从一种设置更改为另一种设置时,世界会“闪烁”或“脉冲”。
有没有一种方法可以平滑地做到这一点,以使 FoV 的变化不会太突然而导致世界上的物体“脉动”?
当设备改变方向时,执行以下代码:
if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight
self.cameraNode?.camera?.fieldOfView = 38
else
self.cameraNode?.camera?.fieldOfView = 50
我尝试将 FoV 更改包装在 UIView 动画块中,但没有奏效。
我尝试在线程上延迟运行它,但这仍然会导致 FoV 发生变化时出现视觉“脉冲”。
有什么方法可以让这个过渡顺利吗?
【问题讨论】:
【参考方案1】:你需要添加你的代码SCNTransaction
像下面这样做动画。
SCNTransaction 类定义了 SceneKit 的场景架构 内容更改,包括隐式动画:事务是 结合对节点的多个更改的单个原子操作, 几何图形、材质或其他场景内容。
if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight
SCNTransaction.begin()
SCNTransaction.animationDuration = 1.5
self.cameraNode?.camera?.fieldOfView = 38
SCNTransaction.commit()
else
SCNTransaction.begin()
SCNTransaction.animationDuration = 1.5
self.cameraNode?.camera?.fieldOfView = 50
SCNTransaction.commit()
【讨论】:
哇,即使在 Apple 未明确声明为可动画的属性上,我也能做到这一点? 不确定,但可以。 你可以在这里阅读更多关于SCNTransaction
的信息:developer.apple.com/documentation/scenekit/animation/…
@Elphaba,很高兴为您提供帮助。
@Elphaba,谢谢回复,我更新了动画时长。以上是关于如何平滑更改不会动画的 SCNCamera 的 FoV?的主要内容,如果未能解决你的问题,请参考以下文章
使用属性键路径为 SCNCamera.fStop 设置动画不起作用,仅在隐式 SCNTransaction 内
更改数据源时 UICollectionView 中的平滑动画
使用动画块之外的更改时,UIView transitionWithView 是平滑的