【问题标题】:How to smoothly change the FoV of an SCNCamera that won't animate?如何平滑更改不会动画的 SCNCamera 的 FoV?
【发布时间】: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 发生变化时出现视觉“脉冲”。

有什么方法可以让这个过渡顺利吗?

【问题讨论】:

    标签: swift animation orientation scenekit scncamera


    【解决方案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,谢谢回复,我更新了动画时长。
    猜你喜欢
    • 2018-01-13
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2020-07-23
    相关资源
    最近更新 更多