Как найти объекты в объекте 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 разных координатных пространства.
Если вы решите использовать "мировое" пространство, вы должны преобразовать и шляпу, и куб в "мировое" пространство. Очевидно, ваши кубики есть, но шляпа нет.
Если вы не хотите беспокоиться о мире, скорее верите в относительность, вы можете просто конвертировать куб в координату / пространство шляпы, используя convertPosition или simdConvertPosition в вашем любимом, перед
boundingBoxContains
Во второй строке кода вы назначаете worldPosition (SCNVector3) переменной hatNode. Таким образом, к тому времени, когда вы вызываете boundingBoxContains для hatNode, hatNode представляет собой SCNVector3. Удалите.worldPosition из второй строки, если код, так что вы назначаете узел представления для hatNode.