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

回答你的评论,可能还有你的问题。 安装.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创建的节点SceneKit 。 在我的例子中,如果chain有一些调整方向阻止了一个简单的动画,比如世界的y轴,可以改为旋转baseNode 。 或者,如果它需要与hetero分离,我将把它放在一个新的,否则为空的节点并旋转它。

  let panNode = SCNNode() panNode.addChildNode(chain) baseNode.addChildNode(panNode) // perform rotations on panNode or baseNode 

从dae文件中获取节点信息的位置。