簡體   English   中英

在 SceneKit 中將 SCNScene 導出為 *.obj

[英]Export SCNScene as *.obj in SceneKit

我們正在嘗試使用 SCNShape init(path: UIBezierPath?, extensionDepth: CGFloat)-Constructor 基於 sortedVerts 數組中的頂點通過場景工具包創建一個簡單的多邊形。 導出的.dae 文件構建得很好,但是.usd-files 和.obj-files 返回空。 這是什么原因? 我們計划在該步驟之后將Constructed.usd 文件導入realitykit。

編碼:

func drawSimplePolygon(from sortedVerts: [Experience.MesspunktSzene]) -> URL {
    
    let scene = SCNScene()
    let path = UIBezierPath()
    
    guard let initialPointX = sortedVerts.first?.position(relativeTo: nil).x else { return URL(string: "")! }
    guard let initialPointY = sortedVerts.first?.position(relativeTo: nil).z else { return URL(string: "")! }
    
    path.move(to: CGPoint(x: CGFloat(initialPointX), y: CGFloat(initialPointY)))
    
    for i in 1..<sortedVerts.count{
        let x = sortedVerts[i].position(relativeTo: nil).x
        let z = sortedVerts[i].position(relativeTo: nil).z
        path.addLine(to: CGPoint(x: CGFloat(x), y: CGFloat(z)))
    }
    path.addLine(to: CGPoint(x: CGFloat(initialPointX), y: CGFloat(initialPointY)))
    path.close()
    
    let shape = SCNShape(path: path, extrusionDepth: 0.02)
    
    let polygonNode = SCNNode(geometry: shape)
    polygonNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green
    polygonNode.geometry?.firstMaterial?.lightingModel = .physicallyBased
    
    scene.rootNode.addChildNode(polygonNode)
    let url: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("test.obj")
    
    scene.write(to: url, delegate: nil)
    
    return url
}

謝謝

也許這將有助於為您提供一種方法。 用於將 SCNNodes 導出為 .obj 文件。

您將需要import SceneKit.ModelIO - 從未在 rootNode 上測試過。 祝你好運

// Get the Geometry to export, do this using a Guard, and return if nil

guard let geometry = yourNode?.geometry else { return }

let fixedFilenameOBJ = String("MyGeometryObject.obj")
let fixedFilenameMTL = String("MyGeometryObject.mtl")

let fullPathOBJ = getDocumentsDirectory().appendingPathComponent(fixedFilenameOBJ) // for the OBJ file
let fullPathMTL = getDocumentsDirectory().appendingPathComponent(fixedFilenameMTL) // for the MTL file

let mesh = MDLMesh(scnGeometry: geometry)
let asset = MDLAsset()
asset.add(mesh)

do {
    try asset.export(to: fullPathOBJ) // this will create two files: the obj + mtl
} catch {
    print("Couldn't create file(s)")
    return
}

另外使用這個 function:

func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return paths.first! // paths[0]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM