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

时间:2019-11-30 17:53:30

标签: xcode scenekit

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

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

导出文件
@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}

所有小盒子都被摧毁,只有一个看起来不错:

enter image description here

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

enter image description here 在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会无声地立即爆炸。

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

2 个答案:

答案 0 :(得分:0)

当我仅生成一个实例时,生成的框可以,可以将文件导入Blender,如果两个实例只有一个可以,则Blender会爆炸。如果我将框更改为球体-QuickLook中可以看到一个球体

绝对是错误。

答案 1 :(得分:0)

我可以确认。以下代码一旦从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)