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

Posted

技术标签:

【中文标题】使用 SceneKit 从 DAE/COLLADA 中提取动画顶点【英文标题】:Extracting animated vertices from DAE/COLLADA using SceneKit 【发布时间】:2013-08-03 18:55:57 【问题描述】:

在 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] 给定 CAAnimationGroup 对象,CAAnimation 对象是通过 CAAnimationGroup.animations 获得的。 CAAnimation 对象(对于我的 DAE 文件)是 CAKeyframeAnimation 的现实实例,我从中获得 CAKeyframeAnimation.values:

关键帧(1/40):

等等。所以要解决上面的#1方法,我需要找到用于这些关键帧的格式。

【问题讨论】:

作为场景渲染器的场景视图具有currentTime 的属性。如果您更改它,是否会为您更新几何图形? 由于我没有使用 SceneKit 进行任何渲染,只是将几何图形导入到我自己的渲染器中,因此我没有任何来自 SceneKit 的 SceneView 或 SceneRenderer 处于活动状态,我可以在其中修改 currentTime 属性,还是我误解了你的建议? 你正确理解了我的问题。 只是好奇:您之前是否构建了渲染管道,或者有没有在 SceneKit 中无法完成的事情(即使作为节点的渲染委托)? 原因是渲染管道是跨平台的,而我正在构建的编辑器/工具部分仅适用于 OSX,我可以通过让 SceneKit 导入COLLADA 文件给我 :) 【参考方案1】:

我的理解是您需要从 SceneKit 检索节点(对象位置)+几何(顶点,法线...)+动画信息 - 然后将这些信息转换为引擎的表示,然后播放动画并转换顶点在您的引擎中。

SceneKit 将使用 SCNNode / SCNGeometry API 为您提供几何和层次结构信息。 您可以使用 SCNNode 的 SCNAnimatable 协议检索动画(animationKeys / animationForKey:)

您可以使用 CoreAnimation 的 CAKeyframeAnimation/CAAnimationGroup API 检索动画的各个关键帧。

【讨论】:

谢谢,我已经尝试过这种方法 - 如果您也有一些关于用于实际关键帧的数据格式的信息,这将非常有帮助。【参考方案2】:

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

【讨论】:

以上是关于使用 SceneKit 从 DAE/COLLADA 中提取动画顶点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 openGL 在 android studio 中渲染 .dae(collada) 文件

使用 MeshLab 结果将 .wrl (VRML) 转换为 .dae (COLLADA) 缺少颜色

有没有办法在 android studio/Java 上使用 .dae (collada) 文件?

如何在 Xcode 10.1 中渲染 DAE (COLLADA) 文件。目前正在崩溃

DAE/COLLADA 模型上 UV 映射的 Papervision 问题

ActionScript 3 Papervision3D - 在Flex中嵌入DAE / Collada文件