Ios SceneKit';剪辑到边界';相等的

Ios SceneKit';剪辑到边界';相等的,ios,scenekit,Ios,Scenekit,除了摄影机xFov、yFov、zNear和zFar之外,SceneKit是否有一种方法可以让节点(及其子节点)“剪裁到边界”,即指定任意3D边界框,从而不渲染位于其外部的任何节点 我的用例如下所示: 我有一个带有清晰彩色背景的SceneView,它显示在一个单独的地图视图的顶部 我只想在3D模型中显示名义上“高于”地面(即地图上方)的节点。当地图是平面图时,我可以通过在SceneKit相机上设置zFar并将相机直接定位在正Z轴上来非常轻松地做到这一点 但是,如果贴图倾斜,则需要调整场景摄影机以匹

除了摄影机xFov、yFov、zNear和zFar之外,SceneKit是否有一种方法可以让节点(及其子节点)“剪裁到边界”,即指定任意3D边界框,从而不渲染位于其外部的任何节点

我的用例如下所示:

我有一个带有清晰彩色背景的SceneView,它显示在一个单独的地图视图的顶部

我只想在3D模型中显示名义上“高于”地面(即地图上方)的节点。当地图是平面图时,我可以通过在SceneKit相机上设置zFar并将相机直接定位在正Z轴上来非常轻松地做到这一点

但是,如果贴图倾斜,则需要调整场景摄影机以匹配贴图倾斜。但是,此时,摄影机z轴不再与场景内容正交,zFar将“显示”模型中理论上位于贴图下方的节点

(如果地图内容是SceneKit节点层次结构的一部分,这将很容易-只需定义一个楼层并在该楼层上渲染地图。但地图显示在位于SceneKit视图下方的单独视图中。)

因此,我希望定义一个平面或边界框,在该平面或边界框外不渲染SceneKit节点,但可以独立于摄影机平截头体进行控制

(至少我认为这是我需要的——也许还有别的办法……)

更新


我发现我可以为SCNView代理实现渲染器(arender:SCNSceneRenderer,didSimulatePhysicsAtTime:NSTimeInterval),并遍历场景节点,测试世界位置,根据需要隐藏或显示。但是,这感觉有点昂贵和低效-我想知道是否有更好的方法?

另一种方法是使用与倾斜贴图匹配的平面“填充”深度缓冲区。这样,您就可以依靠深度测试来剔除每个片段的3d对象。也就是说,要填充深度缓冲区而不渲染到颜色缓冲区,您可能必须进行欺骗(例如渲染不透明度接近0但不是0的平面-否则在写入深度缓冲区之前将丢弃片段)。材质球修改器或自定义材质球可能会有帮助是的-这似乎是可行的。我甚至没有意识到这是可能的-这似乎是对使用不透明属性的一个限制(即,非不透明的东西将掩盖其背后的其他对象),但它确实为我的问题提供了一个解决方案!如果你想把它写下来作为一个答案,我可以接受。另一种方法是用一个与倾斜地图匹配的平面“填充”深度缓冲区。这样,您就可以依靠深度测试来剔除每个片段的3d对象。也就是说,要填充深度缓冲区而不渲染到颜色缓冲区,您可能必须进行欺骗(例如渲染不透明度接近0但不是0的平面-否则在写入深度缓冲区之前将丢弃片段)。材质球修改器或自定义材质球可能会有帮助是的-这似乎是可行的。我甚至没有意识到这是可能的-这似乎是对使用不透明属性的一个限制(即,非不透明的东西将掩盖其背后的其他对象),但它确实为我的问题提供了一个解决方案!另外,如果你想写下来作为回答,我可以接受。