如何使用完成处理程序对 SCNNode 应用一些更改
How to apply some changes to SCNNode with completion handler
基本上我想对 SCNNode 应用一些更改(例如更改 morpher.weights 或更改骨架变换)并在之后渲染场景。
scnRenderer.scene = sceneView?.scene
scnRenderer.pointOfView = sceneView?.pointOfView
scnRenderer.sceneTime = 1
scnRenderer.render(atTime: 0, viewport: viewport, commandBuffer: commandBuffer, passDescriptor:
currentPassDescriptor)
commandBuffer.addCompletedHandler { (buffer) in
animateNextStep?()
}
commandBuffer.commit()
而且我想为整个动画做这件事。伪代码如下所示:
func animateNextStep() { //will be called in render function after rendering
guard step < count else { return }
step += 1
node.applySomeChanges()
render()
}
目前 80% 的图像是好的并且包含具有正确骨骼位置和正确变形器权重的模型,而 20% 不是(看起来它是用以前的值渲染的)。将更改应用到节点后,我需要一些完成处理程序。
我可以在 DispathQueue.main.asyncAfter 中包装渲染,但我认为应该有一些好的解决方案。
如何正确操作?
可能是交易的问题,但如果没有更多上下文就很难说。
在applySomeChanges
中你可以尝试使用显式交易
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
// changes to SceneKit objects
[SCNTransaction commit];
您也可以尝试在 render
方法的开头调用 [SCNTransaction flush];
。
基本上我想对 SCNNode 应用一些更改(例如更改 morpher.weights 或更改骨架变换)并在之后渲染场景。
scnRenderer.scene = sceneView?.scene
scnRenderer.pointOfView = sceneView?.pointOfView
scnRenderer.sceneTime = 1
scnRenderer.render(atTime: 0, viewport: viewport, commandBuffer: commandBuffer, passDescriptor:
currentPassDescriptor)
commandBuffer.addCompletedHandler { (buffer) in
animateNextStep?()
}
commandBuffer.commit()
而且我想为整个动画做这件事。伪代码如下所示:
func animateNextStep() { //will be called in render function after rendering
guard step < count else { return }
step += 1
node.applySomeChanges()
render()
}
目前 80% 的图像是好的并且包含具有正确骨骼位置和正确变形器权重的模型,而 20% 不是(看起来它是用以前的值渲染的)。将更改应用到节点后,我需要一些完成处理程序。
我可以在 DispathQueue.main.asyncAfter 中包装渲染,但我认为应该有一些好的解决方案。
如何正确操作?
可能是交易的问题,但如果没有更多上下文就很难说。
在applySomeChanges
中你可以尝试使用显式交易
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
// changes to SceneKit objects
[SCNTransaction commit];
您也可以尝试在 render
方法的开头调用 [SCNTransaction flush];
。