使用SceneKit从DAE/COLLADA中提取动画顶点

4
在Mac OS X上使用SceneKit加载COLLADA(DAE)文件时,您可以通过遍历SCNNode:s和它们各自的SCNGeometry:s树来轻松获取所有几何体,并使用[geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticVertex]提取顶点数据。
然而,如果给定包含动画对象的DAE文件,那么SceneKit能否在动画中给出每个顶点的确切位置,或者我能否从关联的CAAnimation对象中提取所有动画数据?
我的用例是,我想使用SceneKit导入DAE文件,但对于其他所有内容都使用自己的渲染管道。
澄清: 显然有两种方法可以实现这一点:
1)获取并解析与动画相关的关键帧
2)让SceneKit评估特定时间的场景,并给我预先计算好的顶点(等)坐标
我的用例中的目标是#2,但如果我可以找到SceneKit使用的关键帧格式的文档,则#1也可接受。
问题在于对于#1,我无法深入挖掘以下内容: SCNNode.animationKeys为给定SCNNode可用的动画密钥,[SCNNode animationForKey:key]提供从中获取CAAnimation对象的CAAnimationGroup对象。 CAAnimation对象是(对于我的DAE文件)实际上是CAKeyframeAnimation的实例,其中我获得CAKeyframeAnimation.values:
Keyframe (1/40): <00000000 0000f0bf 00000080 d9956d3c 000000a0 0e32a13c 00000000 00000000 00000020 636772bc 00000020 2914ef3f 00000000 0f7ecebf 00000000 00000000 00000020 1324a1bc 00000000 0f7ecebf 00000020 2914efbf 00000000 00000000 00000000 00000000 000000c0 205c6d40 00000000 00a069c0 00000000 0000f03f> 等。因此,要解决上述#1方法,我需要找到这些关键帧使用的格式。

场景视图作为场景渲染器具有“currentTime”的属性。如果您更改它,那么会为您更新几何形状吗? - David Rönnqvist
由于我没有使用SceneKit进行任何渲染,只是将几何体导入到自己的渲染器中,因此我没有任何来自SceneKit的SceneView或SceneRenderer处于活动状态,我可以修改currentTime属性吗?还是我误解了你的建议? - simonfi
你正确理解了我的问题。 - David Rönnqvist
只是好奇:在构建渲染管道之前,您是否已经在SceneKit中遇到了无法完成的事情(即使作为节点的渲染代理)? - David Rönnqvist
原因是渲染管道是跨平台的,而我正在构建的编辑器/工具部分仅适用于OSX,让SceneKit为我执行COLLADA文件的导入可以节省大量时间 :) - simonfi
2个回答

1
我的理解是,您需要从SceneKit中检索节点(对象位置)+几何形状(顶点,法线...)+动画信息-然后将这些信息转换为您引擎的表示,并在引擎中播放动画并转换顶点。
SceneKit将通过SCNNode / SCNGeometry API提供几何和层次结构信息。您可以通过SCNNode的SCNAnimatable协议(animationKeys / animationForKey :)检索动画。
您可以使用CoreAnimation的CAKeyframeAnimation / CAAnimationGroup API检索动画的各个关键帧。

谢谢,我已经尝试了这种方法 - 如果您还有关于实际关键帧使用的数据格式的信息,那将非常有帮助。 - simonfi

0

看起来 SCNNode 有 presentationNode,可以在动画期间为您提供节点信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接