swift – SceneKit SCNSceneRendererDelegate – 未调用渲染器函
我最近问了一个有一个非常明显答案的
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时,每当我在屏幕上单击或拖动时都会调用渲染器函数(这是有意义的,因为它需要根据摄像机角度更新视图).但我希望每一帧都能调用它. 是否有错误我没看到或者这是我的Xcode中的错误? 编辑: 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课程: 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 } } 但是,它仍然无法正常工作.我究竟做错了什么? 编辑:设置sceneView.loops = true修复了描述的问题
我怀疑答案取决于Querent所说的“每一帧”. Querent应该澄清这一点,但无论如何我都会尝试回答,因为我就是这样.
最简单的解释可能是“无论如何都会呈现的每一帧”,但这似乎不太可能是所期望的,除非该多维数据集旨在作为渲染器的一种活动监视器,这似乎也不可能;有更好的方法. Querent可能想要的是在视图的playing属性为YES时重复渲染.如果是这种情况,那么答案就像将视图的loops属性设置为YES一样简单.这最近为我解决了一个问题,我希望在键盘按键被按下时进行渲染. (我注意到将播放设置为YES会导致对我的代表进行一次调用.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sqlite3使用入门
- ruby-on-rails – Rails – 如何选择表中的最后日
- easyui ajax 动态生成CheckBox 复选框
- Oracle认证专家视频教程-OCP全套教程之学习笔记-
- Swift Compiler Error Binary oprator '+
- QDateTime时区的获取方法
- ruby-on-rails – rvm ruby?? 1.9.2和Rails 3.1无
- logback logback.xml常用配置详解(一)<configu
- 机房收费系统———如何将MSFlexGrid中的数据导入
- C++ normal_distribution高斯正态分布函数用法详