我有一个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)
回答您的评论,也可能回答您的问题。一旦安装了.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我分开旋转,则将其放到新的,否则为空的节点中并旋转它。
SceneKit
chain
baseNode
hetero
let panNode = SCNNode() panNode.addChildNode(chain) baseNode.addChildNode(panNode) // perform rotations on panNode or baseNode