我查看了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
我有一个动态创建SCNView的视图.它的场景是空的,但是当我按下一个按钮时,我想从单独的scn文件中添加一个节点.这个文件包含动画,我想在主场景中设置动画.问题是在将对象添加到场景后,它不是动画.当我将此文件用作SCNView场景时,它可以正常工作.isPlaying和循环已启用.使用动画导入这样的节点还需要做什么?示例代码如下:
override func viewDidLoad() {
super.viewDidLoad()
let scene = SCNScene()
let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
sceneView.scene = scene
sceneView.loops = true
sceneView.isPlaying = true
sceneView.autoenablesDefaultLighting = true
view.addSubview(sceneView)
let subNodeScene = SCNScene(named: "Serah_Animated.scn")!
let serah = subNodeScene.rootNode.childNode(withName: "main", recursively: false)!
scene.rootNode.addChildNode(serah)
}
Run Code Online (Sandbox Code Playgroud) 前往 mixamo.com,选择一个角色,点击动画,选择一个,只需下载为 .dae即可。
将文件放在 Mac 桌面上;点击文件信息)。它将完美地动画角色的动作。
Xcode,拖入文件夹。点击 .dae 文件,点击底部的“播放”图标。它将完美地动画角色的动作。
现在,将角色添加到现有的 SceneKit 场景中。例如:
let p = Bundle.main.url(forResource: "File Name", withExtension: "dae")!
modelSource = SCNSceneSource(url: p, options: nil)!
let geom = modelSource.entryWithIdentifier("geometry316",
withClass: SCNGeometry.self)! as SCNGeometry
theModel = SCNNode(geometry: geom)
.. your node .. .addChildNode(theModel)
Run Code Online (Sandbox Code Playgroud)
(要获取几何名称,只需查看 .dae 文本示例)
您将完美地看到 T 形的角色
然而,似乎不可能在角色上运行动画。
代码看起来像......
theAnime = amySource.entryWithIdentifier("unnamed_animation__0", withClass: CAAnimation.self)!
theModel.addAnimation(theAnime, forKey:"aKey")
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,它都不会动画。
在添加动画的那一刻,角色会跳转到不同的静态位置,并且不执行任何操作。(如果您安排“结束”动画removeAllAnimations(),它只会返回到 T 姿势。)
显然,dae 文件是完美的,因为它在 Mac Finder 中完美地 …