2016-07-27 72 views
1

到SCNNode添加動畫我初始化我的場景是這樣Scenekit:從外部的Collada

// Load COLLADA Character 
let myScene = SCNScene(named: "Characters.scnassets/Police/Police.dae") 

// Recurse through all the child nodes in the Character and add to characterNode 
for node in myScene!.rootNode.childNodes as [SCNNode] 
{ 
    characterNode.addChildNode(node) 
} 

// Add characterNode to scene 
self.rootNode.addChildNode(characterNode) 

是否有可能以動畫從外部DAE添加到characterNode?它通過Mixamo進行自動配置。

回答

2

蘋果公司在其Fox Scenekit app.

下面的函數爲例,從您的art.scnassets文件夾加載動畫:

- (CAAnimation *)animationFromSceneNamed:(NSString *)path { 
    SCNScene *scene = [SCNScene sceneNamed:path]; 
    __block CAAnimation *animation = nil; 

    [scene.rootNode enumerateChildNodesUsingBlock:^(SCNNode *child, BOOL *stop) { 
     if (child.animationKeys.count > 0) { 
      animation = [child animationForKey:child.animationKeys[0]]; 
      *stop = YES; 
     } 
    }]; 

    return animation; 
} 

,然後您可以添加到您的characterNode:

CAAnimation *animation = [self animationFromSceneNamed:@"art.scnassets/characterAnim.scn"]; 
[characterNode addAnimation:animation forKey:@"characterAnim"]; 

這應該是Swift中的等價函數,但我沒有機會去測試它。

func animationFromSceneNamed(path: String) -> CAAnimation? { 
    let scene = SCNScene(named: path) 
    var animation:CAAnimation? 
    scene?.rootNode.enumerateChildNodes({ child, stop in 
     if let animKey = child.animationKeys.first { 
      animation = child.animation(forKey: animKey) 
      stop.pointee = true 
     } 
    }) 
    return animation 
} 
+0

感謝您的回答!我使用Swift(我從未說過)。所以我在[link]中找到了相應的函數(animationWithSceneNamed)(https://developer.apple.com/library/prerelease/content/samplecode/Fox/Listings/Swift_Common_SceneKitExtensions_swift.html#//apple_ref/doc/uid/TP40016154- Swift_Common_SceneKitExtensions_swift -DontLinkElementID_27) 但是,輸入此代碼時,出現錯誤**類型'SCNNode'的值沒有成員'enumerateChildNodes'**。 – Fredrik

+0

我認爲示例代碼現在已經很老了,我已經將objective-c函數轉換爲Swift,看看它是否適用於您。 –

+0

謝謝!有什麼方法可以將動畫添加到所有鍵?我的對象有「身體,底部,頂部」等。不確定「鑰匙」究竟是什麼意思。 – Fredrik