ios - 方法 "isNode(:insideFrustumOf:)"始终为真

标签 ios swift scenekit arkit

我正在尝试验证特定节点是否在场景的当前截锥体内。 因此我使用方法 isNode(_:insideFrustumOf:)来自苹果。 我在每次调用 renderer(_:didAdd:for:) 时都会存钱相应的节点,稍后使用 isNode(_:insideFrustumOf:) 进行测试。

但结果总是为真,这显然是错误的。

为什么我不能测试ARKit添加的节点?

更新: 请求的代码,如果有帮助,太好了!

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    //...
        nodes.append(node)
    //...
}

nodes 是一个 SCNNode 数组。

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        for node in nodes {
            let result = sceneView.isNode(node, insideFrustumOf: sceneView.pointOfView!)
            //...
        }
}

此处对节点进行评估。结果始终为真。

最佳答案

由于您尚未发布所有代码,因此很难提供“明确”的答案。

话虽如此,我已经为您创建了一个运行良好的示例。

首先,我创建了一个 [SCNNode] 来存储添加到屏幕的任何 SCNNode:

 //Array To Store Any Added Nodes To The Scene Hierachy
 var nodesRendered = [SCNNode]()

然后我创建了 3 个不同的 SCNNodes:

/// Creates A Red, Blue & Green SCNNode
func createNodes(){

    //1. Create A Red Sphere
    let redNode = SCNNode()
    let redGeometry = SCNSphere(radius: 0.2)
    redGeometry.firstMaterial?.diffuse.contents = UIColor.red
    redNode.geometry = redGeometry
    redNode.position = SCNVector3(-1.5, 0, -1.5)
    redNode.name = "RedNode"

    //2. Create A Green Sphere
    let greenNode = SCNNode()
    let greenGeometry = SCNSphere(radius: 0.2)
    greenGeometry.firstMaterial?.diffuse.contents = UIColor.green
    greenNode.geometry = greenGeometry
    greenNode.position = SCNVector3(0, 0, -1.5)
    greenNode.name = "GreenNode"

    //3. Create A Blue Sphere
    let blueNode = SCNNode()
    let blueGeometry = SCNSphere(radius: 0.2)
    blueGeometry.firstMaterial?.diffuse.contents = UIColor.blue
    blueNode.geometry = blueGeometry
    blueNode.position = SCNVector3(1.5, 0, -1.5)
    blueNode.name = "BlueNode"

    //4. Add Them To The Hierachy
    augmentedRealityView.scene.rootNode.addChildNode(redNode)
    augmentedRealityView.scene.rootNode.addChildNode(greenNode)
    augmentedRealityView.scene.rootNode.addChildNode(blueNode)

    //5. Store A Reference To The Nodes
    nodesRendered.append(redNode)
    nodesRendered.append(blueNode)
    nodesRendered.append(greenNode)
}

完成此操作后,我创建了一个函数来确定这些是否在相机的 Frustrum 中:

/// Detects If A Node Is In View Of The Camera
func detectNodeInFrustrumOfCamera(){

    guard let cameraPointOfView = self.augmentedRealityView.pointOfView else { return }

    for node in nodesRendered{

        if augmentedRealityView.isNode(node, insideFrustumOf: cameraPointOfView){

            print("\(node.name!) Is In View Of Camera")

        }else{

            print("\(node.name!) Is Not In View Of Camera")
        }
    }

}

最后,在 delegate 回调中,我这样调用函数:

 func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

        detectNodeInFrustrumOfCamera()

  }

产生的结果如下:

RedNode 不在摄像头范围内

BlueNode 不在摄像头视野内

GreenNode 在摄像头视野内

希望它能为您指明正确的方向...

关于ios - 方法 "isNode(:insideFrustumOf:)"始终为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49874798/

相关文章:

ios - 核心数据实体管理器

ios - 如何使用 SCNRender 将 ARKit 集成到 GPUImage 渲染中?

ios - SceneKit 中用于勾勒对象轮廓的 Metal 着色器

ios - 智能地滚动图像

ios - CosmicMind Swift Material 库程序化自动布局与堆叠菜单

ios - 应用程序支持 ipad 和 iphone 中的应用程序横向和纵向模式

ios - UIView 作为 SCNGeometry 的漫反射 Material 故障

ios - 背景图片大小 Sprite Kit Game

swift : How Can I have both LineSpacing and LineHeight on UILabel

macos - 使用 Dark Transparency 使标题栏和 View Controller 无缝衔接