我正在尝试验证特定节点是否在场景的当前截锥体内。 因此我使用方法 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/