当前位置: 首页 > 面试题库 >

SceneKit SCNSceneRendererDelegate-未调用渲染器功能

通俊发
2023-03-14
问题内容

最近,我问了一个问题,其中有一个很明显的答案。我仍在同一个项目上,遇到另一个问题。我需要实现每帧逻辑,并且该SCNSceneRendererDelegate协议在iOS上工作得很好,但是在OSX上,该renderer功能未触发。我创建了一个小示例项目来说明我的问题。它由情节提要中的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,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.allowsCameraControltrue时,renderer每当我点击或在屏幕上拖动(这是有道理的,因为它需要更新基于摄像机角度的视图)函数被调用。但是我希望每帧都可以调用它。

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

编辑:我已经尝试按照下面答案中的说明进行操作,现在对于ViewController具有以下代码:

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, green: 0, blue: 0.3, alpha: 1)
        sceneView.allowsCameraControl = true

        sceneView.delegate = scene
        sceneView.playing = true

    }

}

还有一个MyScene类:

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, height: 0.2, length: 0.2, chamferRadius: 0)
        cube.firstMaterial!.diffuse.contents = NSColor.greenColor()
        cubeNode.geometry = cube
        cubeNode.position = SCNVector3(1,0,0)
        rootNode.addChildNode(cubeNode)

        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(2, 1, 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
    }
}

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

编辑:设置sceneView.loops = true可以解决上述问题


问题答案:

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

最简单的解释可能是“无论如何都会渲染的每个帧”,但是除非多维数据集旨在用作渲染器的一种活动监视器,否则似乎不太可能是理想的,这似乎也不可能。有更好的方法。

Querent可能希望在视图的播放属性为YES时重复渲染。如果真是这样,那么答案也许很简单,就是将视图的loops属性设置为YES。最近,这为我解决了一个问题,我希望在按住键盘键的同时进行渲染。(我已经注意到将播放设置为“是”将引起对我的代表的一个呼叫。)



 类似资料:
  • 问题内容: 我已将JTable设置为在同一列中显示String和Boolean值。我有以下代码来设置两种对象类型的渲染器。 我面临的问题是,总是调用Object的渲染器,而不是布尔值或字符串。我尝试删除对象的渲染器,仍然没有运气。 问题答案: 我已将JTable设置为在同一列中显示String和Boolean值 然后,您不能只使用普通的渲染逻辑。 通常,根据方法返回的值选择渲染器。但是,这是基于列

  • 问题内容: 渲染模板后如何运行方法?我要设置和之后,我需要使用JQuery进行更改(例如,在模板内容的DOM中)。正在“之前”渲染工作(模板的DOM尚不可用)。谢谢。 问题答案: 创建在链接函数中运行代码的指令。构建模板后,将调用链接功能。 请参阅ng-click以获取想法。

  • 我正在重温LibGDX游戏编程,不幸的是,我不得不重新学习我以前知道的东西。 我目前正在使用平铺地图编辑器制作一个非常简单的大金刚风格关卡。我总共有大约20个矩形。 我在我的主要游戏屏幕类中创建了一个box2d世界,并有一个for循环来将矩形对象放入世界和调试器。 我的问题是,只有我绘制的底部(和第一个)矩形出现。我已经检查了比例,还放了一个println(),它告诉我已经解析了对象信息,所有的矩

  • 下面的LWJGL代码将在屏幕中心呈现一个蓝色正方形。相反,我得到了一个空白的白色屏幕。就像渲染根本不工作,或者我在屏幕外渲染。 我是OpenGL和LWJGL的新手,所以我力不从心。我浏览了所有内容,但似乎找不到任何可能与代码有关的问题。 OpenGLTest.scala VertexArray.scala

  • 问题内容: 快速提问。我正在学习React JS。 创建组件时,我们在render函数中提供要渲染的组件的html模板。到目前为止,我只看到带有很少部分html的小型组件,但是我只是想知道如果我们的组件带有巨大的html模板会发生什么情况,有没有办法提供指向单独的html文件的路径?还是我们被迫直接在render函数中编写所有html?谢谢! 问题答案: 您应该始终将其编写在render函数中。您

  • 如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende