swift - 如何平滑地更改不会设置动画的 SCNCamera 的 FoV?

标签 swift animation orientation scenekit scncamera

我有一个 SCNCamera 在 iOS 上的 3D SceneKit View 中工作。

当我改变屏幕的方向时,为了保持世界对象相同的大小和相对位置,我需要改变 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 动画 block 中,但这没有用。

我曾尝试在它的线程上延迟运行它,但随着 FoV 的变化,这仍然会导致视觉“脉冲”。

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

最佳答案

你需要像下面这样用 SCNTransaction 添加你的代码来做动画。

The SCNTransaction class defines SceneKit's architecture for scene content changes, including implicit animations: A transaction is a single atomic operation that combines multiple changes to nodes, geometries, materials, or other scene content.

    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()
}

关于swift - 如何平滑地更改不会设置动画的 SCNCamera 的 FoV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57842389/

相关文章:

mvvm - 项目控件水平放置项目并使子项拉伸(stretch)到堆栈面板宽度

iphone - setStatusBarOrientation 在 iOS8 中导致问题

iOS 12 音乐应用的锁屏控制

ios - 如何在 uitableview admob swift 中显示广告?

ios - Swift:使用AVCaptureVideoDataOutput视频录制时如何将动态文本添加到CMSampleBuffer?

python-2.7 - 如何从 matplotlib 向 FuncAnimation 添加时间控制面板

javascript - Accordion 动画 Jquery

html - Create and Filling arc progressively with css - 圆形进度条

android - Camera App Orientation 刷新父 Activity?

ios - swift/用户界面开关 : how to implement a delegate/listener