Sid*_*kar 8 animation scenekit swift
我查看了WWDC中的Banana游戏,它是用Objective-C编写的,它试图将代码转换为swift以导入动画并在它们之间进行转换,但是我遇到了从DAE文件中快速运行动画的问题.
我有来自3DSMAx和openCollada格式的AutoDesk格式的导出器DAE文件.autodeskformat animtation是针对每个骨骼所以我无法按名称调用动画,因此我只需导入场景并执行以下操作,以便在文件加载后立即启动动画.
scene = SCNScene(named: "monster.scnassets/monsterScene.DAE")
scene2 = SCNScene(named:"monster.scnassets/monster.DAE")
var heroNode = SCNNode()
heroNode = scene.rootNode.childNodeWithName("heroNode", recursively: false)!
var nodeArray = scene2.rootNode.childNodes
for childNode in nodeArray {
heroNode.addChildNode(childNode as SCNNode)
}
Run Code Online (Sandbox Code Playgroud)
尽管动画在场景开始时播放,但我知道如何存储动画.
如果我使用openCollada导出collada文件.我可以使用以下命令来运行get并运行动画,因为在AutoDesk collada格式的情况下,整个对象只有一个动画而不是每个骨骼.通过这种方式,我也可以使用CAAnimation存储动画.
var anim = scene2.rootNode.animationForKey("monster-1")
childNode.addAnimation(anim, forKey: "monster-1")
Run Code Online (Sandbox Code Playgroud)
但是然后角色以某个角度运行并且来回运行而不是在同一个地方跑.
使用openCollada也可以更好地照明.我只想使用openCollada而不是autodesk collada export.现在我使用openCollada格式导出场景,使用autodesk导出字符.
如何在SceneKit中快速存储动画并在它们之间进行过渡?谢谢.:d
ric*_*ter 13
如果在从文件加载场景时不更改默认选项,则场景中的所有动画会立即自动附加到目标节点并播放.(请参阅SceneKit API参考中的动画导入选项.)
如果要从场景文件加载动画并保留它们以便稍后附加到节点(即播放),最好将它们加载到SCNSceneSource类中.此外,您可以(但不必)将基本模型存储在一个文件中,将动画存储在其他文件中.
只需看看这个Bananas动画加载代码.看看吧.*
// In AAPLGameLevel.m:
SCNNode *monkeyNode = [AAPLGameSimulation loadNodeWithName:nil fromSceneNamed:@"art.scnassets/characters/monkey/monkey_skinned.dae"];
AAPLMonkeyCharacter *monkey = [[AAPLMonkeyCharacter alloc] initWithNode:monkeyNode];
[monkey createAnimations];
// In AAPLSkinnedCharacter.m (parent class of AAPLMonkeyCharacter):
+ (CAAnimation *)loadAnimationNamed:(NSString *)animationName fromSceneNamed:(NSString *)sceneName
{
NSURL *url = [[NSBundle mainBundle] URLForResource:sceneName withExtension:@"dae"];
SCNSceneSource *sceneSource = [SCNSceneSource sceneSourceWithURL:url options:nil ];
CAAnimation *animation = [sceneSource entryWithIdentifier:animationName withClass:[CAAnimation class]];
//...
}
// In AAPLMonkeyCharacter.m:
- (void)update:(NSTimeInterval)deltaTime
{
// bunch of stuff to decide whether/when to play animation, then...
[self.mainSkeleton addAnimation:[self cachedAnimationForKey:@"monkey_get_coconut-1"] forKey:nil];
//...
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么:
SCNNode包含角色模型,以及CAAnimation模型可以执行的所有事情(空闲/跳转/抛出/等)的一堆s.AAPLGameSimulation loadNodeWithName:fromSceneNamed:是一个方便的包装器,可以SCNScene从文件加载一个文件并从中获取一个命名节点.)该DAE文件只包含字符模型,没有动画.AAPLMonkeyCharacter从包含每个动画的单独DAE文件中加载(并存储对其所需动画的引用).这就是它的SCNSceneSource用武之地 - 它可以让你从文件中获取动画而无需播放它们.addAnimation:forKey:在其主节点上运行动画.转换到Swift并应用于你的问题 - 你似乎在同一个文件中有所有动画 - 我会做这样的事情(一个假设类的模糊轮廓):
class Monster {
let node: SCNNode
let attackAnimation: CAAnimation
init() {
let url = NSBundle.mainBundle().URLForResource(/* dae file */)
let sceneSource = SCNSceneSource(URL: url, options: [
SCNSceneSourceAnimationImportPolicyKey : SCNSceneSourceAnimationImportPolicyDoNotPlay
])
node = sceneSource.entryWithIdentifier("monster", withClass: SCNNode.self)
attackAnimation = sceneSource.entryWithIdentifier("monsterIdle", withClass: CAAnimation.self)
}
func playAttackAnimation() {
node.addAnimation(attackAnimation, forKey: "attack")
}
}
Run Code Online (Sandbox Code Playgroud)
关键位:
SCNSceneSourceAnimationImportPolicyDoNotPlay 确保从场景源加载的节点不会以附加/播放的动画开始.entryWithIdentifier:withClass:.确保在连接到节点之前配置它们的方式(重复,淡入淡出持续时间等).| 归档时间: |
|
| 查看次数: |
3961 次 |
| 最近记录: |