繁体   English   中英

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

[英]SceneKit keyed blend shape animation imported from Collada (.dae) file (created in Maya) not playing

我正在使用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:我将其作为与苹果公司的bug提交,苹果公司对其进行了测试并返回,并说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)” ”。 但是,在测试中,我无法确认这一点。

关于如何在动画块中引用混合形状权重的任何想法?

谢谢!

您可以在Maya中使用Script Editor烘焙动画,然后将其导出为.dae格式。 有时,“ Edit Export Preset窗口中的烘焙选项不起作用。

因此,选择具有动画blendshape的3d模型并执行以下python命令:

import maya.cmds as cmds

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

# '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" ;

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

或简单地使用主菜单: Edit - Keys - Bake Simulation

另一种可靠的做法是使用OBJ序列导出器.obj文件的填充序列)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM