【问题标题】:Find out when SCNNode disappears from SCNScene找出 SCNNode 何时从 SCNScene 中消失
【发布时间】:2015-01-13 06:14:25
【问题描述】:

从场景中移除 SCNNode 时是否会调用特定方法?

-(void)removeFromParentNode;

不会在 SCNNode 对象上调用。

设置场景

我正在使用重力拉下一个物体。当一个对象向下太远时,它会自动消失,并且绘制调用和多边形数量会减少。所以 SCNNode 肯定会被销毁,但是有什么方法可以让我参与销毁吗?

【问题讨论】:

  • 仅仅因为它没有被渲染并不意味着它已经从它的父级中移除。

标签: objective-c scenekit


【解决方案1】:

其他答案已经很好地涵盖了这一点,但要更进一步:

首先,您的节点并没有从场景中移除——它的内容正在传递到相机的视锥体之外,这意味着 SceneKit 知道它不需要向 GPU 发出绘制调用来渲染它。如果您 enumerate the child nodes 的场景(或任何包含您正在谈论的节点的父节点),您会看到它们仍然存在。您会损失一些渲染性能成本,因为 SceneKit 不需要为它知道在帧中不可见的内容发出绘制调用。

(如 Tanguy 的回答中所述,这可能是因为您的 zFar 设置。也可能不是 - 这取决于节点从相机中掉出的方向。)

但是,如果您不断添加节点并让物理将它们从屏幕上删除,您将累积 预渲染 性能成本,因为 SceneKit 必须每帧遍历场景图并找出哪个它需要发出绘制调用的节点。这个成本对于每个节点来说都非常小,但它最终可能会增加你不想处理的东西。

既然你想在节点掉出框架时发生一些事情,你只需要找到一个很好的机会来处理这个问题并清理消失的节点。

那么在哪里做呢?好吧,你有几个选择。如前所述,您可以在渲染循环中添加一些内容来检查每一帧上每个节点的可见性:

- (void)renderer:(id<SCNSceneRenderer>)renderer didSimulatePhysicsAtTime:(NSTimeInterval)time {
    if (![renderer isNodeInsideFrustum:myNode withPointOfView:renderer.pointOfView]) {
        // it's gone, remove it from scene
    }
}

但是,在每一帧上运行这种检查有点昂贵(请记住,您在这里的目标是 30 或 60 fps)。更好的方法可能是让物理系统帮助您:

  1. 创建一个具有SCNBox 几何图形的节点,该几何图形大到可以“捕捉”从屏幕上掉下来的所有东西。
  2. 给该节点一个静态物理体,并设置类别和碰撞位掩码,以便您的下落节点会与它发生碰撞。
  3. 将该节点定位在视锥体之外,以便您的下落物体在它们掉出视野后立即撞击它。
  4. 实现一个联系人委托方法来销毁下落节点:

    - (void)physicsWorld:(SCNPhysicsWorld *)world didBeginContact:(SCNPhysicsContact *)contact {
        if (/* sort out which node is which */) {
            [fallingNode removeFromParentNode];
            // ... and do whatever else you want to do when it falls offscreen.
        }
    }
    

【讨论】:

  • 不完全是我想要的,但“SCNSceneRenderer”方法帮助我在 Swift 4 中识别了我的 SCNNode。:)
【解决方案2】:

如果您的对象超出活动相机的 ZFar 属性,它将消失。 (默认值为 100.0) 正如 David Rönnqvist 在 cmets 中所说,您的节点没有被破坏,您仍然可以修改它的属性。

如果您想连接到 Node 的几何消失,您可以计算活动相机和 Node 之间的距离,并在渲染循环中的每一帧检查它,以便在它高于 100 时触发动作。

如果你想在更远的距离渲染你的节点,你可以修改相机的 ZFar 属性。

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 2020-03-19
    • 2017-06-24
    • 1970-01-01
    • 2022-12-01
    • 2019-06-26
    • 2017-01-18
    • 2021-06-02
    • 2021-04-23
    相关资源
    最近更新 更多