Search code examples
swiftstlscenekitthumbnails

Generating STL thumbnails in swift


is it at all possible to generate thumbnails from imported stl files in my app? I have a collection view for projects and I would like to generate a thumbnail for the new projects added. my app imports files of types stl (Standard Tesselated Geometry File Format) and .obj (Geometry Definition File Format)


Solution

  • import SceneKit.ModelIO
    
    private let device = MTLCreateSystemDefaultDevice()!
    
    //MARK: thumbnail
    /// Create a thumbnail image of the asset with the specified URL at the specified
    /// animation time. Supports loading of .scn, .usd, .usdz, .obj, and .abc files,
    /// and other formats supported by ModelIO.
    /// - Parameters:
    ///     - url: The file URL of the asset.
    ///     - size: The size (in points) at which to render the asset.
    ///     - time: The animation time to which the asset should be advanced before snapshotting.
    
    func thumbnail(for url: URL, size: CGSize, time: TimeInterval = 0) -> UIImage? {
        let renderer = SCNRenderer(device: device, options: [:])
        renderer.autoenablesDefaultLighting = true
    
        if (url.pathExtension == "scn") {
            let scene = try? SCNScene(url: url, options: nil)
            renderer.scene = scene
        } else {
            let asset = MDLAsset(url: url)
            let scene = SCNScene(mdlAsset: asset)
            renderer.scene = scene
        }
    
        let image = renderer.snapshot(atTime: time, with: size, antialiasingMode: .multisampling4X)
        return image
    }