将 Collada dae 文件加载到 SceneKit 以进行联合操作

Posted

技术标签:

【中文标题】将 Collada dae 文件加载到 SceneKit 以进行联合操作【英文标题】:Loading Collada dae file into SceneKit for joint manipulation 【发布时间】:2015-01-12 16:42:04 【问题描述】:

我正在将一个装配好的 collada 文件加载到 SceneKit 并尝试将骨盆向前旋转 45 度和脊柱。骨盆和脊柱节点确实会加载,但是,旋转似乎不起作用。提取的 2 个 SCNNode 类是 dad 文件中的“联合”节点。

NSURL *url = [[NSBundle mainBundle] URLForResource:@"rigged-character" withExtension:@"dae"];
SCNSceneSource *source = [SCNSceneSource sceneSourceWithURL:url options:nil];
pelvis = [source entryWithIdentifier:@"ID179469248" withClass:[SCNNode class]];
spine = [source entryWithIdentifier:@"ID179691712" withClass:[SCNNode class]];

[pelvis setPivot:SCNMatrix4MakeRotation(MCP_DEGREES_TO_RADIANS(45), 0, 1, 0)];
[spine setPivot:SCNMatrix4MakeRotation(MCP_DEGREES_TO_RADIANS(45), 0, 1, 0)];

有谁知道为什么,我需要补充一下: [myView.scene.rootNode addChildNode:pelvis]; [骨盆addChildNode:spine];

感谢您的帮助。

【问题讨论】:

您是要旋转节点还是改变它们的轴心? 另外,为什么不从 SCNSkinner 的骨架层次结构中获取骨骼节点? 在我从 Cheetah3d 导出的 collada 文件中,我确实有骨盆、脊椎和颈部表示为关节。我想旋转和弯曲骨盆/臀部 45 度,然后我的脊椎 45 度。我刚刚研究了 SCNSkinner,也许这可能是解决这个问题的方法。让我进一步研究一下,让我更深入地研究一下。如果您有任何其他建议,那就太好了。 @David Ronnqvist - 当我在搜索 SCNSkinner 的示例时,它看起来很合适,但搜索返回的页面不到 3 页。我希望会有例子。我可以像上面那样加载模型并对骨骼执行转换,还是您认为我需要创建一个 SCNSkinner 对象(不确定我需要提供的 SCNGeometry 和 boneInverseBindTransforms 参数)。非常感谢。 我希望 dae 文件中的导出字符已经有一个 SCNSkinner。如果没有,我会尝试重新导出角色。在代码中创建一个 skinner 对象是相当复杂的。我只建议在默认情况下 SceneKit 不支持导入另一种文件格式时这样做。 【参考方案1】:

为了创建骨架,我构建骨架如下:

    在collada文件中创建SCNView加载 从SCNView.scene.rootNode 中检索每个SCNNode 使用addChildNode将子节点添加到SCNView的根节点

希望这会有所帮助!

【讨论】:

以上是关于将 Collada dae 文件加载到 SceneKit 以进行联合操作的主要内容,如果未能解决你的问题,请参考以下文章

将 Collada dae 文件加载到 SceneKit 以进行联合操作

如何将 collada 对象加载到 three.js?

Android 将 FBX 或 Collada(.dae) 加载到 Android Studio Activity 中

DAE 模型为 xml

如何在 Three.js 中克隆包含多个网格的 Collada 对象

如何使用 THREE.js 向 collada 文件 (.dae) 添加纹理?