如何在 MacOS 下导出 SceneKit 场景的内容

Eps*_*lon 5 macos collada scenekit swift

将 SceneKit 场景的内容导出到 Collada (.dae) 文件时,我得到了意外的结果。这是我到目前为止所拥有的。

我创建了一个沿 x 轴有 5 个球体的简单场景

var x:CGFloat = 0
for i in 0...4 {
    let sphere = SCNNode(geometry: SCNSphere(radius: 1))
    sphere.name = "sphere\(i+1)"
    sphere.position = SCNVector3(x: x, y: 0, z: 0)
    exportScene.rootNode.addChildNode(sphere)
    x += 2
}
Run Code Online (Sandbox Code Playgroud)

并导出内容

let url = URL(fileURLWithPath: pathName)
exportScene.write(to: url, options: nil, delegate: nil) { totalProgress, error, stop in
    print("Export progress: \(totalProgress * 100.0)%")
}
Run Code Online (Sandbox Code Playgroud)

当我将 .dae 文件加载到 3D 程序 (Cheetah 3D) 中时,我期望沿 x 轴有 5 个相同的球体,但出现以下内容。我在导出到 .obj 文件时遇到了类似的问题。

在此输入图像描述

下面的答案是“请记住,DAE 并不能处理 SceneKit 的所有功能”,但不会涉及文件格式的限制。

将 SceneKit 场景导出为 Collada .dae 文件的最简单方法?

问:有人知道如何导出SceneKit场景的内容吗?

ARG*_*Geo 1

macOS 应用程序

看起来像是 SceneKit 日落的开始。

在 SceneKit macOS 应用程序中,.dae这两种格式都无法正确生成。.obj而且,.usdz根本不导出格式。

iOS应用程序

在iOS应用程序中,仅.usdz正确导出格式(它保留了SCN场景的所有节点的变换和名称)。这.usdz可以在 Maya 中打开。但是.dae.obj文件仅包含一个球体而不是五个。

如果您对 Maya 中的 USDZ 纹理有疑问,请阅读这篇文章

在此输入图像描述


请注意,.usdz使用循环时无法正确导出for-in

import SceneKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let sceneView = self.view as! SCNView
        sceneView.backgroundColor = .black
        sceneView.scene = SCNScene()
        let url = URL(string: "file:///Users/swift/Desktop/model.usdz")!

        let sphere1 = SCNNode(geometry: SCNSphere(radius: 0.5))
        sphere1.position = SCNVector3(x: -2, y: 0, z: 0)
        sceneView.scene!.rootNode.addChildNode(sphere1)
        
        // ...sphere2, sphere3, sphere4...
        
        let sphere5 = SCNNode(geometry: SCNSphere(radius: 0.5))
        sphere5.position = SCNVector3(x: 2, y: 0, z: 0)
        sceneView.scene!.rootNode.addChildNode(sphere5)
            
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            sceneView.scene?.write(to: url, delegate: nil) { (prgs, _, _) in
                print("Export progress: \(prgs * 100.0)%")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

在 macOS 13.0 Ventura、Xcode 14.1、iOS 16.1 模拟器上进行了测试