Преобразование и вращение в Scenekit
У меня есть узел SCN, который я преобразовал в желаемое вращение и угол.
Теперь я хочу вращать его бесконечно по новой оси X, но я не могу заставить его вращаться на 360 градусов, он просто слегка сдвигается.
let spin = CABasicAnimation(keyPath: "rotation")
spin.fromValue = NSValue(SCNVector4: SCNVector4(x: item.rotation.x, y: item.rotation.y, z: item.rotation.z, w: item.rotation.w))
spin.toValue = NSValue(SCNVector4: SCNVector4(x: Float(2*M_PI), y: item.rotation.y, z: item.rotation.z, w: item.rotation.w))
spin.duration = 3
spin.repeatCount = .infinity
item.addAnimation(spin, forKey: "spin around")
Обратите внимание, что я нашел код поворота из предыдущего вопроса, и он работает, как и ожидалось, но не, если я хочу вращаться на преобразованном узле.
РЕДАКТИРОВАТЬ: Код преобразования:
self.item.transform = SCNMatrix4Mult(SCNMatrix4Mult(SCNMatrix4MakeScale(1.1, 1.1, 1.1), SCNMatrix4MakeRotation(2.2, 228.0, 120.0, 55.2)), SCNMatrix4MakeTranslation(-2.5, 12, 6))
self.item.pivot = SCNMatrix4MakeTranslation(0, 0, 4)
self.item.transform = SCNMatrix4Mult(SCNMatrix4MakeTranslation(0, 0, 4), item.transform)
1 ответ
В ответ на ваш комментарий и, возможно, вашу проблему. Установив файл.dae, вы можете получить доступ к узлам, как показано в следующем примере:
// "rhodopsin" is the namne of a .dae file
guard let rho = SCNScene(named: "rhodopsin") else {
print("Couldn't find molecule in dictionary (rhodopsin)")
return }
let chain = rho.rootNode.childNodeWithName("chain", recursively: true)!
let hetero = rho.rootNode.childNodeWithName("hetero", recursively: true)!
Если вам нужно найти имена этих узлов, откройте файл.dae в окне редактора и нажмите на маленькую иконку боковой панели внизу слева. В этой боковой панели находится граф сцены (рис. Ниже). Вы можете не только наблюдать за иерархией, вы можете переименовывать и, при необходимости, перемещать узлы и перерисовывать (осторожно). Возможно, вам придется добавить другие меры предосторожности против файла, который не был найден. Я использую это для создания архивов, а не на стороне клиента.
Чтобы продолжить пример:
baseNode.addChildNode(chain)
baseNode.addChildNode(hetero)
// (baseNode is a child of the current scene's root node)
Теперь они ведут себя так же, как узлы, которые вы создали в SceneKit
, В моем примере, если chain
имел некоторую измененную ориентацию, которая мешала легкой анимации, скажем, относительно оси Y в мире, могла вращаться baseNode
вместо. Или если это нужно вращение отдельно от hetero
Я вместо этого поместил бы это в новый, иначе пустой узел и повернул бы это.
let panNode = SCNNode()
panNode.addChildNode(chain)
baseNode.addChildNode(panNode)
// perform rotations on panNode or baseNode