swift - 如何平滑更改不会动画的 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 的变化,这仍然会导致视觉“脉冲”。
有什么方法可以使这种过渡顺利进行吗?
解决方案
你需要添加你的代码,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()
}
推荐阅读
- android - Android Google Place API,绘制折线
- symfony - 使用 symfony4 序列化器序列化一个对象数组,该对象是另一个对象的属性
- amazon-web-services - 如何仅针对一个环境使用放大 cli 删除资源?
- spring - 如何在 Spring Boot 应用程序中禁用/忽略 @PreAuthorize
- c# - 如果源为空,自动映射器映射列表成员如何使用目标
- jquery - jQuery 没有在控制台日志中定义我的项目
- java - 为什么 WebElement.isDisplayed() 给我一个 NullPointerException
- file - 使用 BATCH 创建一个新文件
- mongodb - 需要 Mongo 查询以从 mongodb 获取文档中多个字段的计数
- android - 片段 setUserVisibleHint 方法已弃用