Swift - Как изменить Pivot объекта SCNNode

Я играл с объектом SCNNode некоторое время, и я потерян с Pivot. Как я могу изменить шарнир SCNNode (SCNBox как бар) и разместить шарнир на одном из краев бара?

2 ответа

Узел pivot является матрицей преобразования, обратная сторона которой применяется к узлу до его transform собственность вступает в силу. Например, посмотрите на этот бит из шаблона игры SceneKit по умолчанию в Xcode:

let boxNode = SCNNode()
boxNode.geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.02)

Если вы установите boxNode "s position эта точка соответствует центру куба, и если вы поворачиваете его (как шаблон делает в анимации), он вращается вокруг своего центра.

Чтобы изменить точку привязки, установите pivot преобразовать перевод:

boxNode.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0.5)

Теперь, когда вы устанавливаете position эта точка соответствует верхнему правому переднему углу куба, и когда вы поворачиваете куб, он вращается вокруг этого угла.

В более общем смысле, стержень преобразует содержимое узла относительно собственного преобразования узла. Предположим, вы хотели смоделировать прецессию оси вращения Земли. Вы можете сделать это, создав две анимации: анимацию pivot вращать узел вокруг своей оси Y, а другой, который оживляет rotation переместить эту ось относительно пространства, содержащего узел.

По основной теме:

На случай, если у вас нет размеров для вашей геометрии / узла, может помочь что-то подобное (особенно для SCNText).

var minVec = SCNVector3Zero
var maxVec = SCNVector3Zero

if node.getBoundingBoxMin(&minVec, max: &maxVec) {

    let bound = SCNVector3(x: maxVec.x - minVec.x,
                           y: maxVec.y - minVec.y,
                           z: maxVec.z - minVec.z)

    node.pivot = SCNMatrix4MakeTranslation(bound.x / 2, 
                                           bound.y / 2, 
                                           bound.z / 2)
}
Другие вопросы по тегам