Как определить, находится ли определенный SCNNode внутри boundingBox другого SCNNode - SceneKit - iOS

Я разрабатываю приложение AR, в котором я хочу определить, находится ли конкретный узел внутри другого (который представляет собой трубу, чтобы объекты могли быть помещены внутри него). У меня есть следующее расширение для SCNNode, чтобы определить, находится ли конкретный SCNVector3 (который может быть позицией SCNNode) внутри boundingBox или нет,

extension SCNNode {
func boundingBoxContains(point: SCNVector3, in node: SCNNode) -> Bool {
    let localPoint = self.convertPosition(point, from: node)
    return boundingBoxContains(point: localPoint)
}

func boundingBoxContains(point: SCNVector3) -> Bool {
    return BoundingBox(self.boundingBox).contains(point)
}
}


struct BoundingBox {
let min: SCNVector3
let max: SCNVector3

init(_ boundTuple: (min: SCNVector3, max: SCNVector3)) {
    min = boundTuple.min
    max = boundTuple.max
}

func contains(_ point: SCNVector3) -> Bool {
    let contains =
        min.x <= point.x &&
            min.y <= point.y &&
            min.z <= point.z &&

            max.x > point.x &&
            max.y > point.y &&
            max.z > point.z

    return contains
}
}

Я пробовал и положение, и свойство worldPosition узла как вход SCNVector3 для упомянутых выше функций, хотя кажется, что результаты не являются правильными, потому что упомянутая функция boundingBoxContains возвращает истинные результаты для объектов, которые НЕ помещены в трубу.

Я вызвал boundingBoxContains функцию, используя следующий код:

let containerNode = sceneView.scene.rootNode.childNode(withName: "tube", recursively: true)
let node = sceneView.scene.rootNode.childNode(withName: "somenode", recursively: true)
if (containerNode!.boundingBoxContains(point: node.position)) {
    print("there is a node inside the tube")
}

0 ответов

Другие вопросы по тегам