• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 使用 Scenekit 场景时间来擦洗动画 iOS

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:12:55 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试修改 Xcode 的默认游戏设置,以便我可以:将动画编程到几何体中,浏览该动画,并让用户自动播放动画。

我设法通过根据擦洗器的值设置 View 的场景时间来使动画擦洗工作。但是,当我将 SCNSceneRenderer 上的 isPlaying bool 值设置为 true 时,它​​会将每一帧的时间重置为 0,我无法让它离开第一帧。

从文档中,我假设这意味着它不会检测到我的动画,并认为所有动画的持续时间都是 0。

这是我的 GameViewController 中的 viewDidLoad 函数:

override func viewDidLoad() {
    super.viewDidLoad()

    // create a new scene
    let scene = SCNScene(named: "art.scnassets/ship.scn")!

    // create and add a camera to the scene
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    scene.rootNode.addChildNode(cameraNode)

    // place the camera
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

    // create and add a light to the scene
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = .omni
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
    scene.rootNode.addChildNode(lightNode)

    // create and add an ambient light to the scene
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = .ambient
    ambientLightNode.light!.color = UIColor.darkGray
    scene.rootNode.addChildNode(ambientLightNode)

    // retrieve the ship node
    let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!

    // define the animation
    //ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))
    let positionAnimation = CAKeyframeAnimation(keyPath: "position.y")
    positionAnimation.values = [0, 2, -2, 0]
    positionAnimation.keyTimes = [0, 1, 3, 4]
    positionAnimation.duration = 5
    positionAnimation.usesSceneTimeBase = true

    // retrieve the SCNView
    let scnView = self.view as! SCNView
    scnView.delegate = self

    // add the animation
    ship.addAnimation(positionAnimation, forKey: "position.y")

    // set the scene to the view
    scnView.scene = scene

    // allows the user to manipulate the camera
    scnView.allowsCameraControl = true

    // show statistics such as fps and timing information
    scnView.showsStatistics = true

    // configure the view
    scnView.backgroundColor = UIColor.black

    // add a tap gesture recognizer
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_))
    scnView.addGestureRecognizer(tapGesture)

    // play the scene
    scnView.isPlaying = true
    //scnView.loops = true
}

感谢任何帮助!

引用资料:

场景时间:

https://developer.apple.com/documentation/scenekit/scnscenerenderer/1522680-scenetime

正在播放:

https://developer.apple.com/documentation/scenekit/scnscenerenderer/1523401-isplaying

相关问题:

SceneKit SCNSceneRendererDelegate - renderer function not called



Best Answer-推荐答案


我无法让它以一种优雅的方式工作,但我通过添加这个 Timer 调用来修复它:

Timer.scheduledTimer(timeInterval: timeIncrement, target: self,   selector: (#selector(updateTimer)), userInfo: nil, repeats: true)

timeIncrement 是一个 Double 设置为 0.01,updateTimer 是如下函数:

// helper function updateTimer
@objc func updateTimer() {
    let scnView = self.view.subviews[0] as! SCNView
    scnView.sceneTime += Double(timeIncrement)
}

我确信有更好的解决方案,但这可行。

关于ios - 使用 Scenekit 场景时间来擦洗动画 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50650615/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap