好的,我已经看过无处不在,我在这里尝试简单地从导入Xcode(或.scn,等等)的.dae中提取动画,这样我就可以在整个场景套件游戏中在模型上运行它。问题是所有引用的方法(包括此处Scenekit: Add animation to SCNNode from external Collada)
似乎在iOS 11中已弃用。所以我无法为我放置在场景中的任何3D模型制作动画。
现在我能够显示模型 - 我从我的dae中获取模型并将其放入我的空白scn中:
if let d = modelScene.rootNode.childNodes.first
{
theDude.node = d
theDude.setupNode() //this scales it down
}
func setupNode()
{
node.scale = SCNVector3(x: modifier, y: modifier, z: modifier)
}
//Then add to scene on tap
let clone = theDude.node.clone()
theDude.node = clone
self.sceneView.scene.rootNode.addChildNode(theDude.node)
theDude.node.position = hitPosition
这很有效。然而,试图让它运行我在Maya中添加到它的动画却没有。我按照Apple的例子将这些扩展添加到我的项目中: https://developer.apple.com/library/content/samplecode/Fox/Listings/Swift_Common_SceneKitExtensions_swift.html
正如它所说的那样尝试这样做,只是用一个立方体作为基本测试(来自上面的问题):
func addAnim()
{
let characterScene = SCNScene(named: "art.scnassets/cubeAnimatedSkeleton.dae")!
let characterTopLevelNode = characterScene.rootNode.childNodes[0]
sceneView.scene.rootNode.addChildNode(characterTopLevelNode)
let idleAnimation = CAAnimation.animationWithSceneNamed("art.scnassets/cubeAnimatedSkeleton.dae")!
idleAnimation.usesSceneTimeBase = false
idleAnimation.repeatCount = Float.infinity
characterTopLevelNode.addAnimation(idleAnimation, forKey: "idle")
}
但是对于这个CAAnimation.animationWithSceneNamed("art.scnassets/cubeAnimatedSkeleton.dae")!
,整个事情都不起作用,因为这是来自APPLE的扩展:
extension CAAnimation {
class func animationWithSceneNamed(_ name: String) -> CAAnimation? {
var animation: CAAnimation?
if let scene = SCNScene(named: name) {
scene.rootNode.enumerateChildNodes({ (child, stop) in
if child.animationKeys.count > 0 {
animation = child.animation(forKey: child.animationKeys.first!) //ERROR
stop.initialize(to: true)
}
})
}
return animation
}
}
表示在iOS 11中不推荐使用addAnimation for key。用animation = child.animationPlayer(forKey: child.animationKeys.first!)
替换它并不起作用,我也不知道还能做什么。
这里有什么问题?