如何从 Xcode 中导入的 .dae 中访问混合形状

Posted

技术标签:

【中文标题】如何从 Xcode 中导入的 .dae 中访问混合形状【英文标题】:How to access blend shapes from blender imported .dae in Xcode 【发布时间】:2019-12-16 15:19:30 【问题描述】:

我对 ARKit 和 SceneKit 以及 3D 建模/Blender 2.8 非常陌生,所以请耐心等待,并为冗长的详细解释道歉,我只是觉得我错过了一些简单的东西,并且在线指南并不多,我可以找到,关于如何做到这一点。

我正在尝试使用 ARKit 和 Scenekit 构建我自己的 animoji/memoji,我正在尝试将其导出到 .dae/.scn 并访问所有混合形状,以便能够使用 ARFaceAnchor 混合形状修改它们.

所以我的 3d 模型具有所有必要的混合形状:

我已将 3d 模型从 Blender 导出到 COLLADA (.dae),并选择了以下内容: 主要的 - 只选, 包括形状键

几何- 应用修改器 - 查看 三角测量

如果我随后在文本编辑器中打开 .dae 文件,我可以在其中看到所有 Blend 形状和材质。

然后我将文件导入我的 .scnassets 文件夹并获取以下实体:

在这个阶段,我设法找到了一些包含搅拌机形状作为几何变形器的示例 .scn 文件。但是,我的仅包含以下内容,无法添加它们。

我设置了我的场景,SCNNode 工作正常,出现在视图中。我也无法在 SCCNode 的任何地方找到混合形状。

 func sceneSetup() 
        let scene = SCNScene()
        DispatchQueue.main.async 
            if let filePath = Bundle.main.path(forResource: "smiley_8.16-1", ofType: "dae", inDirectory: "Models.scnassets") 
                let referenceURL = URL(fileURLWithPath: filePath)
                self.contentNode = SCNReferenceNode(url: referenceURL)
                self.contentNode?.load()

                scene.rootNode.addChildNode(self.contentNode!) 
            
        

        sceneView.scene = scene

        sceneView.allowsCameraControl = true
        sceneView.backgroundColor = UIColor.gray
    

我假设我必须在某处设置一个 SCNMorpher 才能访问混合形状。但如果我能得到一些关于如何和在哪里的指示。此外,如果有人知道我如何将 morpher 设置为节点检查器中的属性,那就太好了。

【问题讨论】:

【参考方案1】:

您需要将 instance_controllers 添加到 Blender dae 文件中,以便 SceneKit 可以正确读取混合形状。在将文件导入 SceneKit 之前,您可以使用 this great tool 修复文件。然后,形状键出现在 Xcode SceneKit 编辑器中,您可以使用 SCNMorpher 类在代码中进行修改。

【讨论】:

感谢您,我已经取得了一些进展,并且可以在 SceneKit 编辑器中看到混合形状。但是,左右的顶点组似乎存在问题,因此例如“blinkRight”的眨眼动画会眨眼。此外,眼睛的镜像修改器没有导出,因此只有一只眼睛可见。你有什么想法吗? 我尝试使用修改器导出,但它会扭曲混合形状动画。 您的混合形状在 Blender 中是否按预期工作?听起来你的镜像修改器有问题

以上是关于如何从 Xcode 中导入的 .dae 中访问混合形状的主要内容,如果未能解决你的问题,请参考以下文章

如何允许组件中的函数访问构造函数中导入的工厂?

Blender .dae 移除 xcode 中的修饰符

iOS Xcode 从 Maya 导入 COLLADA .dae 3D 模型,同时尊重枢轴点

DAE文件解析错误

从 Collada (.dae) 文件(在 Maya 中创建)导入的 SceneKit 键控混合形状动画未播放

python如何删除已在shell中导入的模块?