SCNView 导出的 Collada (.dae) 文件看起来不同,无法导入到 Blender

Posted

技术标签:

【中文标题】SCNView 导出的 Collada (.dae) 文件看起来不同,无法导入到 Blender【英文标题】:SCNView exported Collada (.dae) file looks different and impossible to import to Blender 【发布时间】:2019-11-30 17:53:30 【问题描述】:

我从SCNView 导出场景时遇到问题。 在 Xcode 中,我用光和一个大的透明盒子制作了简单的场景。 在运行的应用程序中会生成彩色的小盒子。 SCNView 中的场景如下所示:

我对此很满意。 但是如果我通过

导出文件
@IBAction func exportDAE(_ sender: Any) 
    if let scene = view3D.scene 
        let panel = NSSavePanel()
        panel.allowedFileTypes = ["dae"]
        panel.runModal()
        if let url = panel.url 
            scene.write(to: url,
                        options: nil,
                        delegate: nil,
                        progressHandler: nil);
        
    

抛出一个错误:

2019-12-02 13:27:16.450749+0100 ShowMeInstances[83949:14810790] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo=NSLocalizedDescription=query cancelled

所有的小盒子都被销毁了,只有一个大的看起来还可以:

有时材料也会被破坏:(那些被破坏的洋红色盒子应该与被包围的盒子颜色相似:

在 AppDelegate 我定义:

var instancesNode: InstancesNode? = nil

发起者:

class InstancesNode: SCNNode 
    typealias CoordUnit = Double

    var instanceGenerator: InstanceGenerator<CoordUnit>?
    init(with data: Data) throws 

            self.instanceGenerator = try InstanceGenerator(from: data)

        super.init()

        for instance in instanceGenerator?.instances ?? [] 
            let coords = instance.coordinates.map( $0.value)
            let color =  getMaterialDiffuseColor(for: coords)
            let coords3D = convertCoordinatesTo3D(coords)
            let node = Instance3D(
                name: instance.instanceName,
                coordinates: coords3D,
                color: color)

            self.addChildNode(node)
        
    
.....

现在Instance3D

发起
class Instance3D: SCNNode 

    init (name: String, coordinates: SCNVector3, color: NSColor) 
        super.init()
        self.name = name

        let box = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
        let material = SCNMaterial()
        material.diffuse.contents = color
        material.emission.contents = color
        material.lightingModel = .lambert
        material.metalness.contents = 0
        material.shininess = 1

        box.materials = [material]

        self.position = coordinates
        self.geometry = box
    

一切都被插入到场景中

view3D.scene?.rootNode.addChildNode(instancesNode!)

在 appDelegate 中。如果没有这条线,则只能看到大盒子和灯光。

Blender 也无法导入文件,Blender 无声无息立即爆炸。

可能是什么原因?这是一个功能还是一个错误?

【问题讨论】:

能分享一下生成大小立方体的代码吗? 大立方体是通过编辑器添加的。给我几分钟。 我添加了代码并试图解释这个结构是如何创建的逻辑。 【参考方案1】:

当我只生成一个Instance时,生成的盒子是OK的,可以将文件导入Blender,如果两个——只有一个是OK的,Blender会爆炸。如果我将框更改为球体 - 在 QuickLook 中可以看到一个球体

绝对是错误。

【讨论】:

【参考方案2】:

我可以确认。下面的代码,一旦从 SceneKit 以 .dae 格式导出,Blender 就会崩溃(并且会导致 Meshlab 出错,并且在 Mac OS X 的 finder 预览中无法正确渲染)。

var radius = 0.0005
let s1 = SCNNode(geometry: SCNSphere(radius: CGFloat(radius)))
let s2 = SCNNode(geometry: SCNSphere(radius: CGFloat(radius)))
s1.position = SCNVector3(0,0,0)
s2.position = SCNVector3(1,0,0)
scene.rootNode.addChildNode(s1)
scene.rootNode.addChildNode(s2)

【讨论】:

以上是关于SCNView 导出的 Collada (.dae) 文件看起来不同,无法导入到 Blender的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit - 停止连续循环 Collada 动画

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

dae 到 gltf pbr 导出不导出纹理不是 base64

Collada .DAE 的哪些节点与游戏对象和角色使用最相关?

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

无法使用 Three.js 加载从搅拌机导出的纹理 Collada