Анимируйте высоту SCNBox, сохраняя базу в том же y

У меня есть объект SCNBox, добавленный в SCNScene через SCNNode...

let box:SCNBox = SCNBox(width: 4, height: 4, length: 4, chamferRadius: 0.1)
box.firstMaterial?.diffuse.contents = UIColor.greenColor()
let boxNode:SCNNode = SCNNode(geometry: box)
boxNode.position = SCNVector3(x: 2, y: 2, z: 2)
scene.rootNode.addChildNode(boxNode)

Мой вопрос: как я могу анимировать высоту (скажем, до 40) и в то же время, чтобы коробка не росла вниз?

Я думаю, мне нужно изменить точку поворота, чтобы перейти в нижнюю часть коробки?

Я не уверен, как это сделать, если это решение.

Как я могу сделать это правильно?


person zumzum    schedule 23.11.2014    source источник


Ответы (1)


Да, вы правы в том, что pivot — это то, что вам нужно изменить. Поворот — это преобразование, то есть он может включать масштабирование и вращение для установки «базовой» ориентации узла, но все, что вам нужно, — это перемещение. Чтобы закрепить коробку внизу, переместите ось на половину высоты коробки:

boxNode.pivot = SCNMatrix4MakeTranslation(0, -(box.height/2), 0)

Однако этого недостаточно, чтобы зафиксировать его, если вы измените высоту — точка поворота останется на половине старой высоты, поэтому ваш блок все равно будет расти в обоих направлениях. Поэтому вам нужно будет изменить точку опоры, а также высоту при анимации:

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(5)
box.height = 20
boxNode.pivot = SCNMatrix4MakeTranslation(0, -(box.height/2), 0) // new height
SCNTransaction.commit()

Поскольку вы анимируете и box.height, и boxNode.pivot вместе, они останутся закрепленными внизу на протяжении всей анимации.

person rickster    schedule 23.11.2014