ARKit Maniacs

1a1d418bdf51cbf8fce1317f6c80a907?s=47 satoshi0212
September 01, 2018

ARKit Maniacs

1a1d418bdf51cbf8fce1317f6c80a907?s=128

satoshi0212

September 01, 2018
Tweet

Transcript

  1. "3,JU.BOJBDT גࣜձࣾ"CFNB57෰෦ஐ TBUPTIJ!TINEFWFMPQ J04%$ J04%$

  2. "3,JU.BOJBDT גࣜձࣾ"CFNB57෰෦ஐ TBUPTIJ!TINEFWFMPQ J04%$ J04%$

  3. ஫εϥΠυ಺༰͸CFUB൛ͷެ։৘ใΛݩʹ͍ͯ͠·͢ɻ

  4. None
  5. "3Ϊϧυ

  6. "3Ϊϧυ

  7. "3Ϊϧυ

  8. "3Ϊϧυ

  9. "3Ϊϧυ

  10. "3Ϊϧυ

  11. ຊ୊

  12. "3,JU

  13. 4BWJOHBOEMPBEJOHNBQT 8PSMEUSBDLJOHFOIBODFNFOUT &OWJSPONFOUUFYUVSJOH *NBHFUSBDLJOH 0CKFDUEFUFDUJPO (B[FBOEUPOHVF ARKit 2 - Summary

  14. TPVSDF8IBU`T/FXJO"3,JU IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  15. 8PSME.BQ1FSTJTUFODFͷ࣮ݧ &OWJSPONFOU5FYUVSJOHͷ࣮ݧ ฏ໘Λݟ͚͔ͭͯΒͷ޻෉

  16. 8PSME.BQ1FSTJTUFODFͷ࣮ݧ &OWJSPONFOU5FYUVSJOHͷ࣮ݧ ฏ໘Λݟ͚͔ͭͯΒͷ޻෉

  17. 4BWJOHBOEMPBEJOHNBQT 8PSMEUSBDLJOHFOIBODFNFOUT &OWJSPONFOUUFYUVSJOH *NBHFUSBDLJOH 0CKFDUEFUFDUJPO (B[FBOEUPOHVF ARKit 2 - Summary

  18. "38PSME4IBSJOHBOE1FSTJTUFODF

  19. ͲΕ͚ͩͷػೳΛ͍࣋ͬͯΔͷ͔

  20. ੈք͸γΣΞͰ͖Δͷ͔ 

  21. ௚ײʮͰ͖ͳͦ͞͏ʯ

  22. ͦ΋ͦ΋ԿΛอଘ͍ͯ͠Δͷ͔

  23. "38PSME.BQ

  24. TPVSDF8IBU`T/FXJO"3,JU IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  25. 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 } }
  26. 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) }
  27. 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 } }
  28. อଘ

  29. 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)") } }
  30. ಡࠐ

  31. 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)") }
  32. 3FMPDBMJ[F

  33. let configuration = self.defaultConfiguration // this app's standard settings configuration.initialWorldMap

    = worldMap sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
  34. ੈք͸γΣΞͰ͖Δͷ͔  ͸ର৅͕େ͖͍ͷͰ

  35. ݐ෺͸γΣΞͰ͖Δͷ͔ʁ

  36. ֊ݐͯϏϧ಺ͷ͍͔ͭ͘ͷΤϦΞͰ࣮ଌ

  37. γϯϓϧͳ෦԰ GFBUVSFT BODIPST ,# ࡶଟͳ෦԰
 GFBUVSFT BODIPST .# ϥ΢ϯδ
 GFBUVSFT

    BODIPST .# ݐ෺ͷݰ͔ؔΒ࿓Լͱ֊ஈΛ௨Γ'·Ͱ
 GFBUVSFT BODIPST ,#
  38. ࡶଟͳ෦԰ͷೖޱΛੈքͷத৺ͱͯ͠Έͨ ίʔώʔΧοϓ഑ஔ

  39. None
  40. ݐ෺ͰγΣΞ੒ޭ

  41. ߴ௿ࠩ͋ΔൣғͰӬଓԽ෮ݩ σʔλαΠζͷ໨ॲ ਺.#ఔ౓Ͱ͸4FTTJPO։࢝଎౓ʹେࠩͳ͠ த৺఺Ͱ͸ͳͯ͘΋։࢝Մೳ อଘ͢Δ৘ใ͸ׂͱࣗ༝

  42. ߴ௿ࠩ͋ΔൣғͰӬଓԽ෮ݩ ˢ'΁ͷҠಈͰ΋େ͖ͳζϨͳ͠ σʔλαΠζͷ໨ॲ ˢ'΁ͷҠಈέʔεͰ͸,# ਺.#ఔ౓Ͱ͸4FTTJPOͷ։࢝଎౓ʹେࠩͳ͠ ˢ4FTTJPO։࢝͸Tɻͨͩ͠SFMPDBMJ[F·Ͱʹ͸਺ඵɻ த৺఺Ͱ͸ͳͯ͘΋SFMPDBMJ[F։࢝Մೳ ˢ'Λத৺ͱͨ͠ੈքͰݰؔͰSFMPDBMJ[FՄ อଘ͢Δ৘ใ͸ׂͱࣗ༝ ˢ4OBQ4IPU"ODIPSͳͲ

  43. 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) } ...
  44. ੈքγΣΞ࣮ݱͷલʹौ୩γΣΞ͔ ࣍ͷน͸σʔλαΠζ

  45. ଓใ͓଴ͪԼ͍͞

  46. 8PSME.BQ1FSTJTUFODFͷ࣮ݧ &OWJSPONFOU5FYUVSJOHͷ࣮ݧ ฏ໘Λݟ͚͔ͭͯΒͷ޻෉

  47. 4BWJOHBOEMPBEJOHNBQT 8PSMEUSBDLJOHFOIBODFNFOUT &OWJSPONFOUUFYUVSJOH *NBHFUSBDLJOH 0CKFDUEFUFDUJPO (B[FBOEUPOHVF ARKit 2 - Summary

  48. "EEJOH3FBMJTUJD3FqFDUJPOTUPBO"3&YQFSJFODF

  49. TPVSDF"EEJOH3FBMJTUJD3FqFDUJPOTUPBO"3&YQFSJFODF IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUBEEJOH@SFBMJTUJD@SFqFDUJPOT@UP@BO@BS@FYQFSJFODF

  50. let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = .horizontal configuration.environmentTexturing = .automatic

    sceneView.session.run(configuration)
  51. let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = .horizontal configuration.environmentTexturing = .automatic

    sceneView.session.run(configuration)
  52. None
  53. BVUPNBUJD

  54. "3,JUHFOFSBUFTFOWJSPONFOUUFYUVSFTCZDPMMFDUJOHDBNFSBJNBHFSZ EVSJOHUIF"3TFTTJPO#FDBVTF"3,JUDBOOPUTFFUIFTDFOFJOBMM EJSFDUJPOT JUVTFT NBDIJOFMFBSOJOHUPFYUSBQPMBUFB SFBMJTUJDFOWJSPONFOUGSPNBWBJMBCMFJNBHFSZ TPVSDF"EEJOH3FBMJTUJD3FqFDUJPOTUPBO"3&YQFSJFODF IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUBEEJOH@SFBMJTUJD@SFqFDUJPOT@UP@BO@BS@FYQFSJFODF

  55. None
  56. NBOVBM

  57. let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = .horizontal configuration.environmentTexturing = .manual

    sceneView.session.run(configuration)
  58. let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = .horizontal configuration.environmentTexturing = .manual

    sceneView.session.run(configuration)
  59. TPVSDF"EEJOH3FBMJTUJD3FqFDUJPOTUPBO"3&YQFSJFODF IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUBEEJOH@SFBMJTUJD@SFqFDUJPOT@UP@BO@BS@FYQFSJFODF

  60. 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) ... }
  61. 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) ... }
  62. // MARK: - ARSCNViewDelegate func renderer(_ renderer: SCNSceneRenderer, updateAtTime time:

    TimeInterval) { updateEnvironmentProbe(atTime: time) }
  63. None
  64. ͳΜͱػցֶशͰݟ͑ͳ͍ྖҬΛࣗಈੜ੒ͯ͘͠Ε͍ͯΔ NBOVBMͰ͸ൣғͷϕετϓϥΫςΟε͕ࣔ͞Ε͍ͯΔ ಛఆ༻్ͳ͚Ε͹BVUPNBUJDͰྑ͍ͷͰ͸ ͦͷଞʹ΋5JQT͋Γ

  65. "WPJEWJSUVBMDPOUFOUUIBUSFRVJSFTBDDVSBUFSFqFDUJPOT TVDI BTNJSSPSpOJTITVSGBDFT )BOEMFNPWJOHPCKFDUT %PO`UHFOFSBUFFOWJSPONFOUUFYUVSFTUPPPGUFO "WPJEBCSVQUUSBOTJUJPOTCFUXFFOEJ⒎FSFOUFOWJSPONFOU UFYUVSFT Use Environment Texturing

    Wisely
  66. 8PSME.BQ1FSTJTUFODFͷ࣮ݧ &OWJSPONFOU5FYUVSJOHͷ࣮ݧ ฏ໘Λݟ͚͔ͭͯΒͷ޻෉

  67. None
  68. ฏ໘ൃݟޙ λοϓ͢Δͱݕ஌͸ࢭ·Γ αΠζͱ޲͖ͷௐ੔Ϟʔυ΁

  69. None
  70. %FTJHO"3FYQFSJFODFTGPSQSFEJDUBCMFMJHIUJOHDPOEJUJPOT 6TFUSBDLJOHRVBMJUZJOGPSNBUJPOUPQSPWJEFVTFS GFFECBDL "MMPXUJNFGPSQMBOFEFUFDUJPOUPQSPEVDFDMFBSSFTVMUT  BOEEJTBCMFQMBOFEFUFDUJPOXIFOZPVIBWFUIFSFTVMUTZPV OFFE Best Practices and

    Limitations
  71. ৼΓฦΓ

  72. 8PSME.BQ1FSTJTUFODFͷ࣮ݧ ˠσʔλαΠζͷ՝୊ &OWJSPONFOU5FYUVSJOHͷ࣮ݧ ˠಛఆ༻్ͳ͚Ε͹BVUPNBUJDͰྑ͍ͷͰ͸ ฏ໘Λݟ͚͔ͭͯΒͷ޻෉ ˠετϨεݮΒ͢࢓૊ΈͷҰྫ

  73. 6OEFSTUBOEJOH8PSME5SBDLJOHJO"3,JU IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUVOEFSTUBOEJOH@XPSME@USBDLJOH@JO@BSLJU 4XJGU4IPU$SFBUJOHB(BNFGPS"VHNFOUFE3FBMJUZ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUTXJGUTIPU@DSFBUJOH@B@HBNF@GPS@BVHNFOUFE@SFBMJUZ $SFBUJOHB1FSTJTUFOU"3&YQFSJFODF IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUDSFBUJOH@B@QFSTJTUFOU@BS@FYQFSJFODF "EEJOH3FBMJTUJD3FqFDUJPOTUPBO"3&YQFSJFODF IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUBEEJOH@SFBMJTUJD@SFqFDUJPOT@UP@BO@BS@FYQFSJFODF "SDIJWJOH8PSME.BQ%BUBGPS1FSTJTUFODFPS4IBSJOH IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBSLJUBSXPSMENBQBSDIJWJOH@XPSME@NBQ@EBUB@GPS@QFSTJTUFODF@PS@TIBSJOH

    8IBU`T/FXJO"3,JU IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 6OEFSTUBOEJOH"3,JU5SBDLJOHBOE%FUFDUJPO IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED *OTJEF4XJGU4IPU$SFBUJOHBO"3(BNF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED $SFBUJOH(SFBU"3&YQFSJFODFT IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED ࢀߟ