首页 > 解决方案 > 使用 SCNGeometry 进行关键值观察以获取详细程度

问题描述

我正在尝试使用 kvo 来观察节点的几何形状,因为 Scenekit 没有提供某种回调来让我知道节点的详细级别何时更新。这样做的目的是我的节点有空闲动画,当细节级别更改为最详细版本以外的任何内容时,我想从节点中删除动画,以避免运行不必要的空闲动画。

下面是观察设置。将细节级别添加到几何图形的代码在其他地方,但它确实运行,因为我可以看到几何图形随着节点的像素半径的变化而变化。

永远不会调用更改处理程序。如果我改为观察节点的位置,则当我将节点放置在场景中的位置时会触发更改处理程序。是否有另一个我应该监控的属性,或者是否有另一种方法可以确定节点已更改使用中的细节级别,以便我可以从该节点中删除动画?

import SceneKit

class ObservableNode: SCNReferenceNode {

    private var geometryObservation: NSKeyValueObservation?

    override init?(url referenceURL: URL) {
        super.init(url: referenceURL)

        self.load()

        geometryObservation = observe(
            \.geometry,
            options: [.old, .new]
        ) { node, change in
            print("geometry did change")
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

标签: iosswiftscenekitkey-value-observinglevel-of-detail

解决方案


马特和我一起解决了这个问题,这是我们提出的解决方案:

https://stackoverflow.com/a/57871058/5978327


推荐阅读