如何使用完成处理程序将某些更改应用于SCNNode

问题描述 投票:0回答:1

基本上,我想对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%的图像是好的,并且包含具有正确骨骼位置和正确morpher权重的模型,而20%则不是(看起来像以前的值渲染的那样)。将更改应用到节点后,我需要一些完成处理程序。

我可以将渲染包装在DispathQueue.main.asyncAfter中,但我认为应该有一些好的解决方案。

如何正确处理?

ios scenekit arkit scnnode
1个回答
1
投票

可能是交易问题,但没有更多上下文很难说。

applySomeChanges中,您可以尝试使用显式交易

[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];

// changes to SceneKit objects

[SCNTransaction commit];

并且您也可以尝试在[SCNTransaction flush];方法的开头调用render

© www.soinside.com 2019 - 2024. All rights reserved.