Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift – SceneKit SCNSceneRendererDelegate – 未调用渲染器函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我最近问了一个有一个非常明显答案的 question.我还在研究同一个项目并遇到另一个问题.我需要实现每帧逻辑,并且SCNSceneRendererDelegate协议在iOS上工作得很好,但在OSX上,渲染器函数没有触发.我创建了一个示例项目来说明我的问题.它由storyboard中的Scene Kit视图和ViewController类中的以下代码组成: import Cocoa import
我最近问了一个一个非常明显答案的 question.我还在研究同一个项目并遇到另一个问题.我需要实现每帧逻辑,并且SCNSceneRendererDelegate协议在iOS上工作得很好,但在OSX上,渲染器函数没有触发.我创建了一个示例项目来说明我的问题.它由storyboard中的Scene Kit视图和ViewController类中的以下代码组成:
import Cocoa
import SceneKit

class ViewController: NSViewController,SCNSceneRendererDelegate {

    @IBOutlet weak var sceneView: SCNView!

    let cubeNode = SCNNode()

    override func viewDidLoad() {

        super.viewDidLoad()

        let scene = SCNScene()

        let sphere = SCNSphere(radius: 0.1)
        sphere.firstMaterial!.diffuse.contents = NSColor.yellowColor()
        let sphereNode = SCNNode(geometry: spherE)
        scene.rootNode.addChildNode(sphereNodE)

        let cube = SCNBox(width: 0.2,height: 0.2,length: 0.2,chamferRadius: 0)
        cube.firstMaterial!.diffuse.contents = NSColor.greenColor()
        cubeNode.geometry = cube
        cubeNode.position = SCNVector3(1,0)
        scene.rootNode.addChildNode(cubeNodE)

        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(2,1,2)
        let consTraint = SCNLookAtConsTraint(target: cubeNodE)
        cameraNode.consTraints = [constraint]
        scene.rootNode.addChildNode(cameraNodE)

        sceneView.scene = scene
        sceneView.BACkgroundColor = NSColor(red: 0.5,green: 0,blue: 0.3,alpha: 1)
        sceneView.allowsCameraControl = true

        sceneView.delegate = self
        sceneView.playing = true

    }

    func renderer(renderer: SCNSceneRenderer,updateAtTime time: NSTimeInterval) {
        cubeNode.position.x += 0.1
    }
}

我想要的只是基本上每帧移动立方体.但没有任何反应.奇怪的是,当我将sceneView.allowsCameraControl设置为true时,每当我在屏幕上单击或拖动时都会调用渲染器函数(这是有意义的,因为它需要根据摄像机角度更新视图).但我希望每一帧都能调用它.@H_450_18@

是否有错误我没看到或者这是我的Xcode中的错误?@H_450_18@

编辑:
我已经尝试按照下面的答案中的说明,现在有ViewController的以下代码:@H_450_18@

import Cocoa
import SceneKit

class ViewController: NSViewController {

    @IBOutlet weak var sceneView: SCNView!
    let scene = MyScene(create: truE)

    override func viewDidLoad() {

        super.viewDidLoad()

        sceneView.scene = scene
        sceneView.BACkgroundColor = NSColor(red: 0.5,alpha: 1)
        sceneView.allowsCameraControl = true

        sceneView.delegate = scene
        sceneView.playing = true

    }

}

和MyScene课程:@H_450_18@

import Foundation
import SceneKit

final class MyScene: SCNScene,SCNSceneRendererDelegate {

    let cubeNode = SCNNode()

    convenience init(create: Bool) {
        self.init()

        let sphere = SCNSphere(radius: 0.1)
        sphere.firstMaterial!.diffuse.contents = NSColor.yellowColor()
        let sphereNode = SCNNode(geometry: spherE)
        rootNode.addChildNode(sphereNodE)

        let cube = SCNBox(width: 0.2,0)
        rootNode.addChildNode(cubeNodE)

        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(2,2)
        let consTraint = SCNLookAtConsTraint(target: cubeNodE)
        cameraNode.consTraints = [constraint]

        rootNode.addChildNode(cameraNodE)
    }

    @objc func renderer(aRenderer: SCNSceneRenderer,updateAtTime time: NSTimeInterval) {
        cubeNode.position.x += 0.01
    }
}

但是,它仍然无法正常工作.我究竟做错了什么?@H_450_18@

编辑:设置sceneView.loops = true修复了描述的问题@H_450_18@

我怀疑答案取决于Querent所说的“每一帧”. Querent应该澄清这一点,但无论如何我都会尝试回答,因为我就是这样.

最简单的解释可能是“无论如何都会呈现的每一帧”,但这似乎不太可能是所期望的,除非该多维数据集旨在作为渲染器的一种活动监视器,这似乎也不可能;有更好的方法.@H_450_18@

Querent可能想要的是在视图的playing属性为YES时重复渲染.如果是这种情况,那么答案就像将视图的loops属性设置为YES一样简单.这最近为我解决一个问题,我希望在键盘按键被按下时进行渲染. (我注意到将播放设置为YES会导致对我的代表进行一次调用.)@H_450_18@

大佬总结

以上是大佬教程为你收集整理的swift – SceneKit SCNSceneRendererDelegate – 未调用渲染器函数全部内容,希望文章能够帮你解决swift – SceneKit SCNSceneRendererDelegate – 未调用渲染器函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。