如何使用完成处理程序对 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];