Генерация эскизов STL в swift

#swift #stl #scenekit #thumbnails

#swift #stl #scenekit #эскизы

Вопрос:

возможно ли вообще генерировать эскизы из импортированных файлов stl в моем приложении? У меня есть представление коллекции для проектов, и я хотел бы сгенерировать эскиз для новых добавленных проектов. мое приложение импортирует файлы типов stl (стандартный формат файла тесселированной геометрии) и .obj (формат файла определения геометрии)

Комментарии:

1. Попробуйте создать пустую сцену-заполнитель в SceneKit с подсветкой и камерой. Затем загрузите файлы в сцену с помощью ModelO и создайте свой снимок SCNView .

2. @jlsiewert разве это не было бы невероятно неэффективно с точки зрения памяти

3. это потребовало бы больших ресурсов, но файл a stl содержит только список вершин. Если вы хотите сгенерировать изображение, вам нужно будет импортировать его в 3D-движок и визуализировать изображение с помощью этого движка. Однако, если вы делаете это только один раз при импорте, все должно быть в порядке, просто сохраните эскиз рядом с вашим файлом stl.

4. @jlsiewert В итоге я использовал SCNRenderer и сделал снимок. он поддерживает все форматы, поддерживаемые ModelIO. У меня просто вопрос, можно ли поворачивать объекты перед созданием моментальных снимков. Есть идеи?

Ответ №1:

 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
}