使用 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) 文件。目前正在崩溃