Изменение pivot
узла концептуально аналогично вставке промежуточного узла между этим узлом и его родителем. Это может быть полезно в разных случаях. Одним из примеров является случай, когда центр геометрии узла находится не там, где вы ожидаете.
Например, если у вас есть SCNBox
, его ограничивающая рамка
- мин:
(-0.5 * width, -0.5 * height, -0.5 * length)
- макс:
(+0.5 * width, +0.5 * height, +0.5 * length)
- центр:
(0.0, 0.0, 0.0)
Если вы хотите, чтобы length
из SCNBox
увеличивалось только по положительной оси Z, то вам нужно
- мин:
(-0.5 * width, -0.5 * height, 0.0)
- макс:
(+0.5 * width, +0.5 * height, length)
- центр:
(0.0, 0.0, +0.5 * length)
Ограничительная рамка геометрии никогда не изменится, но есть способы упорядочить узлы и изменить их ограничивающие рамки.
Решение 1. Промежуточный узел
Одним из распространенных решений при работе с преобразованиями является использование промежуточных узлов для лучшего понимания того, как применяются преобразования.
В вашем случае вы захотите изменить иерархию узлов с
- parentNode
| - node
| * geometry
| * transform = SCNMatrix4MakeScale(...)
to
- parentNode
| - intermediateNode
| * transform = SCNMatrix4MakeScale(...)
| | - node
| | * geometry
| | * transform = SCNMatrix4MakeTranslation(0, 0, +0.5 * length)
В этой новой иерархии центр ограничивающей рамки node
по-прежнему равен (0.0, 0.0, 0.0)
, но центр ограничивающей рамки intermediateNode
равен (0.0, 0.0, +0.5 * length)
.
Масштабируя intermediateNode
вместо node
, вы получите желаемый результат.
Решение 2. Сводка
Оказывается, именно это и делает свойство pivot
:
node.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5 * length);
Как только вы мысленно определили преобразование промежуточного узла, просто установите его inverse в свойство pivot
.
Дополнительную информацию о свойстве pivot
можно найти здесь: https://developer.apple.com/reference/scenekit/scnnode/1408044-pivot
Это очень похоже на свойство anchorPoint
Core Animation для CALayer
, за исключением того, что в Core Animation точка привязки указывается относительно ограничивающей рамки слоя (идет от 0
до 1
в процентах от ширины и высоты слоя), а в SceneKit это абсолютный.
person
mnuages
schedule
05.03.2017