Вопрос по scenekit, refactoring, ios, swift – Общая высота SCNNode дочерних узлов

4

В настоящее время я использую следующее, чтобы получить общую высоту всех дочерних узлов вSCNNode, Есть ли более эффективный / лучший / короткий / более быстрый способ сделать это?

CGFloat(columnNode.childNodes.reduce(CGFloat()) {
    let geometry = $1.geometry! as SCNBox
    return $0 + geometry.height
})

Ваш Ответ

1   ответ
13

и способ получить более правильный ответ тоже. Суммирование высоты всех геометрий дочерних узлов ...

работает только если геометрияSCNBoxне учитывает преобразования дочерних узлов (что если они перемещены, повернуты или масштабированы?)не учитывает преобразование родительского узла (что если вы хотите высоту в пространстве сцены?)

То, что вы хотите, этоSCNBoundingVolume протокол, который применяется ко всем узлам и геометриям и описывает наименьшее прямоугольное или сферическое пространство, содержащее все содержимое узла (и его подузлов).

В Swift 3 это очень просто:

let (min, max) = columnNode.boundingBox

После этого,min а такжеmax являются координатами нижнего заднего левого и верхнего переднего правого углов наименьшего возможного прямоугольника, содержащего все внутриcolumnNodeнезависимо от того, как устроен этот контент (и какая геометрия задействована). Эти координаты выражены в той же системе, что иcolumnNode.position, поэтому, если искомая «высота» находится в направлении оси Y этого пространства, просто вычтите координаты Y этих двух векторов:

let height = max.y - min.y

В Swift 2 его синтаксис немного странный, но он работает достаточно хорошо:

var min = SCNVector3Zero
var max = SCNVector3Zero
columnNode.getBoundingBoxMin(&min, max: &max)
Ограничивающие объемы выражаются в собственной системе координат узла. Если вы хотите ограничить объем относительно чего-то еще (например, родительского узла), вам придетсяперерабатывать эти минимальные и максимальные баллы. rickster
Спасибо за ответ, но это не объясняет масштаб? Например, если вы делаетеcolumNode.scale = SCNVector3(x: 2, y: 2, z: 2) перед вычислением высоты высота остается неизменной, а не масштабируется. Или мы что-то не так делаем? Crashalot
Потрясающие! Большое спасибо за подробное объяснение Kyle Decot

Похожие вопросы