#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
}