首页 > 解决方案 > 如何平滑更改不会动画的 SCNCamera 的 FoV?

问题描述

我有一个 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 的变化,这仍然会导致视觉“脉冲”。

有什么方法可以使这种过渡顺利进行吗?

标签: swiftanimationorientationscenekitscncamera

解决方案


你需要添加你的代码,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()
}

推荐阅读