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)
}