首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出SCNNode何时从SCNScene消失

找出SCNNode何时从SCNScene消失
EN

Stack Overflow用户
提问于 2015-01-11 19:45:01
回答 2查看 1.7K关注 0票数 0

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

-(void)removeFromParentNode;

不会在SCNNode对象上被调用。

设置场景

我用重力拉下一个物体。当对象向下太远时,它会自动消失,绘制调用和多边形计数会减少。所以SCNNode绝对是被摧毁了,但是有什么方法我可以钩到毁灭吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-12 22:14:25

其他答案已经很好地说明了这一点,但更进一步说:

首先,您的节点没有从场景中移除--它的内容正传递到摄像机的观察结果之外,这意味着SceneKit知道它不需要向GPU发出绘制调用来呈现它。如果您对场景(或任何包含您正在讨论的节点的父节点)进行枚举子节点。,您将看到它们仍然存在。您损失了一些渲染性能成本,因为SceneKit不需要发出抽签请求,因为它知道在框架中看不到的东西。

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

但是,如果您继续添加节点并让物理将它们从屏幕上删除,您将积累预渲染性能成本,因为SceneKit必须遍历每个帧的场景图,并确定需要发出抽签请求的节点。这个成本对于每个节点来说都是非常小的,但最终可能会导致一些您不想处理的事情。

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

那在哪能做到呢?你有几个选择。如前所述,您可以在呈现循环中添加一些内容,以检查每个帧上每个节点的可见性:

代码语言:javascript
复制
- (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. 执行联系人委托方法以销毁掉下的节点:
  • physicsWorld:(SCNPhysicsWorld *)world didBeginContact:(SCNPhysicsContact *)联系人{ if (/* )排序哪个节点是哪个*/) { fallingNode removeFromParentNode;// .当它掉到屏幕外时,做你想做的任何事情。}}
票数 3
EN

Stack Overflow用户

发布于 2015-01-12 15:34:07

如果你的对象比你的活动相机的ZFar属性更进一步,它就会消失。(默认值是100.0)正如大卫·伦奎斯特在评论中所说,你的节点没有被销毁,你仍然可以修改它的属性。

如果你想连接到你的节点的几何消失,你可以计算出你的活动相机和你的节点之间的距离,并检查它在你的渲染循环中的每一个帧,以触发一个动作,如果它超过100。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27891315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档