我从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}
所有小盒子都被摧毁,只有一个看起来不错:
有时材料也会损坏:(那些洋红色被破坏的盒子应该与周围的盒子具有相似的颜色:
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会无声地立即爆炸。
可能是什么原因?是功能还是错误?
答案 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)