Created
June 12, 2018 06:31
-
-
Save warrenm/f4f1c7f7e71bd88fc3d3df95b60d5f04 to your computer and use it in GitHub Desktop.
Generating thumbnail images of 3D model files for use with AR QuickLook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import SceneKit | |
class ARQLThumbnailGenerator { | |
private let device = MTLCreateSystemDefaultDevice()! | |
/// 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 | |
} | |
} |
is .reality supported?!
I don't believe so. The supported formats are a subset of the constants listed here.
I got this issue while using in cellForItemAt
[SceneKit] Error: Failed to load <C3DImage 0x28016c200 src:file:///private/var/mobile/Containers/Data/Application/19E310AE-1945-417C-B09D-D215DF530BD5/Documents/fender_stratocaster.usdz [0.000000x0.000000]>
love you for this code :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I use a bash script to curl a php script on my server to list my directory of models, then for each model I wget the file, call "swift $PLAYGROUND $file, then scp the thumbnail back to my server. A playground is actually a directory and the swift file to call from a terminal lives in there usually as "Contents.swift". Right click on the playground and "show package contents". You can access arguments in swift with "CommandLine.arguments". You could also do everything in the playground and not use bash, but I was in a hurry and curl / wget / scp seemed easy enough.