【问题标题】:Extracting animated vertices from DAE/COLLADA using SceneKit使用 SceneKit 从 DAE/COLLADA 中提取动画顶点
【发布时间】: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 文件给我 :)

标签: objective-c macos animation core-animation scenekit


【解决方案1】:

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

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2017-01-19
    • 2015-06-15
    • 2018-05-15
    • 2018-02-22
    • 2020-03-20
    • 2017-01-02
    • 2014-10-12
    • 2016-12-01
    相关资源
    最近更新 更多