Как найти объекты в объекте SCNNode boundingBox для функции показать / скрыть

Возникла проблема с получением функции для работы при попытке настроить определение boundingBox в SCNNode. Я ожидаю, что смогу вызвать функцию boundingBox, чтобы обнаружить объекты внутри SCNNode и скрыть / показать эти объекты при нажатии кнопки, вот мое текущее состояние ниже:

 @IBAction func hideCubeButtonTapped(sender: UIButton) {
    guard let hatNode = hatNode?.presentation.worldPosition else { return }


    for cubeNode in cubeNodes {


        // hide/show cubeNodes in the hat
        if (hatNode.boundingBoxContains(point: cubeNode.presentation.worldPosition)) {
            print("Hide Button Tapped")
            if cubeNode.isHidden == true {
                cubeNode.isHidden = false
            } else {
                cubeNode.isHidden = true
            }
        }
    }
}

который вызывает функцию 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 {пусть 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
}

}

при вызове hatNode.boundingBoxContains эта ошибка показывает: "Значение типа 'SCNVector3' не имеет члена boundingBoxContains'"

hatNode не устанавливается как SCNVector3? что мне здесь не хватает? Я новичок, чтобы быстро, пожалуйста, поправьте меня здесь!

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

2 ответа

worldPosition и его братья и сестры, и их simd двоюродные братья недавно представлены SCNNode в iOS11, даже если он плохо (или не) задокументирован, вы можете получить некоторые подсказки в самом термине "мир" и комментарии в источнике, как показано ниже.

/*!
 @abstract Determines the receiver's position in world space (relative to the scene's root node).
 */
@available(iOS 11.0, *)
open var simdWorldPosition: simd_float3

Для вашей проблемы есть 2 решения, но вы должны выбрать один стиль, который вы предпочитаете. Из вашего кода вы смешивали, используя 2 разных координатных пространства.

  1. Если вы решите использовать "мировое" пространство, вы должны преобразовать и шляпу, и куб в "мировое" пространство. Очевидно, ваши кубики есть, но шляпа нет.

  2. Если вы не хотите беспокоиться о мире, скорее верите в относительность, вы можете просто конвертировать куб в координату / пространство шляпы, используя convertPosition или simdConvertPosition в вашем любимом, перед boundingBoxContains

Во второй строке кода вы назначаете worldPosition (SCNVector3) переменной hatNode. Таким образом, к тому времени, когда вы вызываете boundingBoxContains для hatNode, hatNode представляет собой SCNVector3. Удалите.worldPosition из второй строки, если код, так что вы назначаете узел представления для hatNode.

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