Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ARKit Maniacs

Avatar for satoshi0212 satoshi0212
September 01, 2018

ARKit Maniacs

Avatar for satoshi0212

satoshi0212

September 01, 2018
Tweet

More Decks by satoshi0212

Other Decks in Technology

Transcript

  1. import ARKit @available(iOS 12.0, *) open class ARWorldMap : NSObject,

    NSCopying, NSSecureCoding { /** The position of the center of the mapped world in meters. */ open var center: simd_float3 { get } /** The extent of the mapped world in meters. */ open var extent: simd_float3 { get } /** A list of anchors in the map. */ open var anchors: [ARAnchor] /** The feature points in the map. */ open var rawFeaturePoints: ARPointCloud { get } }
  2. import ARKit @available(iOS 11.0, *) open class ARAnchor : NSObject,

    ARAnchorCopying, NSSecureCoding { /** Unique identifier of the anchor. */ open var identifier: UUID { get } /** An optional name used to associate with the anchor. */ @available(iOS 12.0, *) open var name: String? { get } /** The transformation matrix that defines the anchor’s rotation, translation and scale in world coordinates. */ open var transform: simd_float4x4 { get } /** Initializes a new anchor object. @param transform The transformation matrix that defines the anchor’s rotation, translation and scale in world coordinates. */ public init(transform: simd_float4x4) /** Initializes a new anchor object with the provided identifier and name. @param name A name to associate with the anchor. @param transform The transformation matrix that defines the anchor’s rotation, translation and scale in world coordinates. */ @available(iOS 12.0, *) public init(name: String, transform: simd_float4x4) }
  3. import ARKit @available(iOS 11.0, *) open class ARPointCloud : NSObject,

    NSSecureCoding { /** The number of points in the point cloud. */ open var __count: Int { get } /** The 3D points comprising the point cloud. */ open var __points: UnsafePointer<simd_float3> { get } /** The 3D point identifiers comprising the point cloud. */ open var __identifiers: UnsafePointer<UInt64> { get } } @available(iOS 11.0, *) extension ARPointCloud { /** The 3D points comprising the point cloud. */ @nonobjc public var points: [vector_float3] { get } /** The 3D point identifiers comprising the point cloud. */ @nonobjc public var identifiers: [UInt64] { get } }
  4. sceneView.session.getCurrentWorldMap { worldMap, error in guard let map = worldMap

    else { return } do { let data = try NSKeyedArchiver.archivedData(withRootObject: map, requiringSecureCoding: true) try data.write(to: self.mapSaveURL, options: [.atomic]) } catch { fatalError("Can't save map: \(error.localizedDescription)") } }
  5. do { guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from:

    data) else { fatalError("No ARWorldMap in archive.") } return worldMap } catch { fatalError("Can't unarchive ARWorldMap from file data: \(error)") }
  6. let configuration = self.defaultConfiguration // this app's standard settings configuration.initialWorldMap

    = worldMap sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
  7. γϯϓϧͳ෦԰ GFBUVSFT BODIPST ,# ࡶଟͳ෦԰
 GFBUVSFT BODIPST .# ϥ΢ϯδ
 GFBUVSFT

    BODIPST .# ݐ෺ͷݰ͔ؔΒ࿓Լͱ֊ஈΛ௨Γ'·Ͱ
 GFBUVSFT BODIPST ,#
  8. class SnapshotAnchor: ARAnchor { let imageData: Data convenience init?(capturing view:

    ARSCNView) { guard let frame = view.session.currentFrame else { return nil } let image = CIImage(cvPixelBuffer: frame.capturedImage) let orientation = CGImagePropertyOrientation(cameraOrientation: UIDevice.current.orientation) let context = CIContext(options: [.useSoftwareRenderer: false]) guard let data = context.jpegRepresentation(of: image.oriented(orientation), colorSpace: CGColorSpaceCreateDeviceRGB(), options: [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 0.7]) else { return nil } self.init(imageData: data, transform: frame.camera.transform) } ...
  9. func updateEnvironmentProbe(atTime time: TimeInterval) { guard let object = virtualObject

    else { return } ... // Make sure the probe encompasses the object and provides some surrounding area to appear in reflections. var extent = object.extents * object.simdScale extent.x *= 3 // Reflect an area 3x the width of the object. extent.z *= 3 // Reflect an area 3x the depth of the object. // Also include some vertical area around the object, but keep the bottom of the probe at the // bottom of the object so that it captures the real-world surface underneath. let verticalOffset = float3(0, extent.y, 0) let transform = float4x4(translation: object.simdPosition + verticalOffset) extent.y *= 2 // Create the new environment probe anchor and add it to the session. let probeAnchor = AREnvironmentProbeAnchor(transform: transform, extent: extent) sceneView.session.add(anchor: probeAnchor) ... }
  10. func updateEnvironmentProbe(atTime time: TimeInterval) { guard let object = virtualObject

    else { return } ... // Make sure the probe encompasses the object and provides some surrounding area to appear in reflections. var extent = object.extents * object.simdScale extent.x *= 3 // Reflect an area 3x the width of the object. extent.z *= 3 // Reflect an area 3x the depth of the object. // Also include some vertical area around the object, but keep the bottom of the probe at the // bottom of the object so that it captures the real-world surface underneath. let verticalOffset = float3(0, extent.y, 0) let transform = float4x4(translation: object.simdPosition + verticalOffset) extent.y *= 2 // Create the new environment probe anchor and add it to the session. let probeAnchor = AREnvironmentProbeAnchor(transform: transform, extent: extent) sceneView.session.add(anchor: probeAnchor) ... }