从 Collada (.dae) 文件(在 Maya 中创建)导入的 SceneKit 键控混合形状动画无法播放

问题描述 投票:0回答:1

我正在使用 Maya 创建要在 SceneKit 中使用的动画。我使用 Maya 的内置 FBX DAE 导出器导出为 COLLADA 文件 (.dae)。

节点变换上的动画都完美运行。例如,如果我们有平移、旋转或缩放(或这些的组合)的动画,则动画会随节点正确导入。

但是,当我导入基于关键帧混合形状输入的动画时,动画不会播放。

在 Xcode 中,如果我单击 .dae 文件并开始查看属性,该节点就在那里并且附加了混合形状(几何变形器),并且它是可操作的。

此外,还列出了一个动画,如果我查看节点内的属性,动画也会在那里列出。

如果我迭代 SCNNode 的 animationKeys 属性,就会出现一个动画,并且它具有与其关联的正确时间量。但我似乎无法让它发挥作用。

在 Xcode 方面,我已经尝试过:

  • 当提示在 Xcode 中更新 .dae 文件时,说“更新”。

  • 出现提示时不更新 .dae 文件

  • 将 Jon Allee 的 Collada Morph Adjuster 应用于 .dae 文件,然后将其提供给 Xcode。

  • 加载为 SCNSceneSource 而不是 SCNScene

在 Maya 方面,我尝试了创建/导出过程的几种变体:

  • 尝试了“删除单键”复选框(有或没有)

  • 尝试了导出窗口中的“烘焙动画”设置

  • 尝试选中和取消选中“变形模型”和“混合形状

  • 在导出窗口中的“Collada”选项下,我尝试过选中和不选中“Single Matrix”。我现在通常会检查“Single Matrix”,或者在 Xcode 中看到一堆动画。然而,选中或不选中此选项似乎不会对 SceneKit 的行为产生任何影响。变换动画可以以任何方式工作,而混合形状动画则不能以任何方式工作。

  • 我还仔细查看了数十个 Stack Overflow 问题——这
不是

重复的问题,以及 Apple 论坛中的问题,但我没有想法。 我整理了一个

快速示例项目

,演示了工作和非工作,并包括源 Maya 文件以及几个解释视频。 我正在使用:

Maya 2018.2(剪辑ID:201711281015-8e846c9074)

Xcode 9.3(9E145)

macOS High Sierra 10.13.4

iOS 11.3.1

代码片段:

let scene = SCNScene() let fileName = "anim.scnassets/cube-blend.dae" let modelName = "pCube2" guard let nodeScene = SCNScene(named: fileName) else { fatalError("COULD NOT OPEN SCENE FILE \(fileName)") } guard let node = nodeScene.rootNode.childNode(withName: modelName, recursively: true) else { fatalError("COULD NOT FIND NODE \(modelName) in file \(fileName)") } scene.rootNode.addChildNode(node)

这就是加载和运行其他动画所需的全部内容。

更新1:

我将此作为一个错误提交给 Apple,Apple 进行了测试并返回并表示 Maya 正在生成伪造的 .dae 文件。 具体来说,他们写道:

cube-blend.dae 包含混合形状动画,但目标语法 不正确:pCube2-lib-morph-weights(Weight_0_0)。这是一 导出器问题(我们尝试在 Modo 中导入此文件 [无法打开] 和 Cinema4D [正确加载但没有动画])。

这是 Maya 导出器中的一个错误。

根据我自己的测试,我倾向于同意他们的观点,尽管很难理解动画中使用的顶级软件之一为何有一个完全损坏的导出器。

我尝试将实际的 COLLADA .dae 文件粘贴到此处,但它太大了。这是一个保管箱链接:

cube-blend.dae

这是关于以下内容的部分:

<library_animations> <animation id="pCube2-anim" name="pCube2"><animation><source id="pCube2-Matrix-animation-input"><float_array id="pCube2-Matrix-animation-input-array" count="25"> 0.041667 0.083333 0.125000 0.166667 0.208333 0.250000 0.291667 0.333333 0.375000 0.416667 0.458333 0.500000 0.541667 0.583333 0.625000 0.666667 0.708333 0.750000 0.791667 0.833333 0.875000 0.916667 0.958333 1.000000 1.041667</float_array><technique_common><accessor source="#pCube2-Matrix-animation-input-array" count="25"><param name="TIME" type="float"/></accessor></technique_common></source><source id="pCube2-Matrix-animation-output-transform"><float_array id="pCube2-Matrix-animation-output-transform-array" count="400"> 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 1.000000</float_array><technique_common><accessor source="#pCube2-Matrix-animation-output-transform-array" count="25" stride="16"><param type="float4x4"/></accessor></technique_common></source><source id="pCube2-Interpolations"><Name_array id="pCube2-Interpolations-array" count="25"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array><technique_common><accessor source="#pCube2-Interpolations-array" count="25"><param type="name"/></accessor></technique_common></source><sampler id="pCube2-Matrix-animation-transform"><input semantic="INPUT" source="#pCube2-Matrix-animation-input"/><input semantic="OUTPUT" source="#pCube2-Matrix-animation-output-transform"/><input semantic="INTERPOLATION" source="#pCube2-Interpolations"/></sampler><channel source="#pCube2-Matrix-animation-transform" target="pCube2/matrix"/></animation><animation><source id="pCube2-lib-morph-weights-animation-inputWeight_0_0"><float_array id="pCube2-lib-morph-weights-animation-inputWeight_0_0-array" count="5"> 0.041667 1.041667 1.541667 1.583333 3.875000</float_array><technique_common><accessor source="#pCube2-lib-morph-weights-animation-inputWeight_0_0-array" count="5"><param name="TIME" type="float"/></accessor></technique_common></source><source id="pCube2-lib-morph-weights-animation-outputWeight_0_0"><float_array id="pCube2-lib-morph-weights-animation-outputWeight_0_0-array" count="5"> 0.000000 0.788732 1.000000 1.000000 0.000000</float_array><technique_common><accessor source="#pCube2-lib-morph-weights-animation-outputWeight_0_0-array" count="5"><param name="Weight_0_0" type="float"/></accessor></technique_common></source><source id="pCube2-lib-morph-weights-animation-intanWeight_0_0"><float_array id="pCube2-lib-morph-weights-animation-intanWeight_0_0-array" count="5"> 0.000000 0.222222 0.000000 0.000000 0.000000</float_array><technique_common><accessor source="#pCube2-lib-morph-weights-animation-intanWeight_0_0-array" count="5"><param name="Weight_0_0" type="float"/></accessor></technique_common></source><source id="pCube2-lib-morph-weights-animation-outtanWeight_0_0"><float_array id="pCube2-lib-morph-weights-animation-outtanWeight_0_0-array" count="5"> 0.000000 0.111111 0.000000 0.000000 0.000000</float_array><technique_common><accessor source="#pCube2-lib-morph-weights-animation-outtanWeight_0_0-array" count="5"><param name="Weight_0_0" type="float"/></accessor></technique_common></source><source id="pCube2-lib-morph-weights-animation-interpolationWeight_0_0"><Name_array id="pCube2-lib-morph-weights-animation-interpolationWeight_0_0-array" count="5"> BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array><technique_common><accessor source="#pCube2-lib-morph-weights-animation-interpolationWeight_0_0-array" count="5"><param type="name"/></accessor></technique_common></source><sampler id="pCube2-lib-morph-weights-animationWeight_0_0"><input semantic="INPUT" source="#pCube2-lib-morph-weights-animation-inputWeight_0_0"/><input semantic="OUTPUT" source="#pCube2-lib-morph-weights-animation-outputWeight_0_0"/><input semantic="IN_TANGENT" source="#pCube2-lib-morph-weights-animation-intanWeight_0_0"/><input semantic="OUT_TANGENT" source="#pCube2-lib-morph-weights-animation-outtanWeight_0_0"/><input semantic="INTERPOLATION" source="#pCube2-lib-morph-weights-animation-interpolationWeight_0_0"/></sampler><channel source="#pCube2-lib-morph-weights-animationWeight_0_0" target="pCube2-lib-morph-weights(Weight_0_0)"/></animation></animation> </library_animations>

更新2:

苹果工程师还表示“用“pCube2-lib-morph-weights(0)”替换目标“pCube2-lib-morph-weights(Weight_0_0)”是有效的
”。然而,在我的测试中,我无法证实这一点。 关于如何在动画块中引用混合形状权重有什么想法吗?

谢谢!

python swift animation scenekit maya
1个回答
0
投票
Script Editor

烘焙动画,然后才能将其导出为

.dae
格式。最短的方法是选择带有动画混合形状的 3D 模型并执行两个 Python 命令之一:
import maya.cmds as cmds

# obsolete command
cmds.bakeSimulation('pFace1', t=(1,96), sb=1, at=["rx","ry","rz"], hi="below")

import maya.cmds as cmds

# new command
cmds.bakeResults('pFace1', t=(1,96), simulation=True)

##  'pFace1' -> a name of your geo in DAG
##  t -> timerange in frames
##  sb -> sampleBy (amount to sample)
##  at -> list of attributes to select
##  hi -> hierarchy. Valid values are "above", "below", "both", "none"

或者简单地使用主菜单:
Edit

Keys
Bake Simulation
另一个稳健的做法是使用 

OBJ 序列导出器

.obj 文件的填充序列)。

    

© www.soinside.com 2019 - 2024. All rights reserved.