Slide 1

Slide 1 text

2018೥3݄16೔ 1 Kenta Tokumoto AR mode in Yahoo! MAP

Slide 2

Slide 2 text

Outline • ࣗݾ঺հ • ARϞʔυʹ͍ͭͯ • ARKit + CoreLocation • ΦϒδΣΫτͷ഑ஔํ๏ʹ͍ͭͯ 2

Slide 3

Slide 3 text

3 About me ,FOUB5PLVNPUP 5XJUUFSUPUPNP  (JUIVCUPUPNP  2JJUBUPUPNP  ೖࣾ೥໨ ."1ͷJ04 8FC"1*։ൃ୲౰ 8&# %#13&447PM:BIPP."1ͷαʔ Ϗεվળʹ͍ͭͯJ04 8FC"1*ͷ෦෼Λࣥච͠· ͨ͠

Slide 4

Slide 4 text

AR mode? 4

Slide 5

Slide 5 text

Team 5 Product Manager Designer Engineer

Slide 6

Slide 6 text

ARKit • iOS 11Ҏ߱Ͱ࢖͑ΔARػೳΛ࣮૷͢Δͷʹศ རͳFramework • AR mode͸Position TrackingΛඞཁͱ͢ΔͨΊ A9νοϓ͕౥ࡌ͞Εͨ୺຤ͷΈαϙʔτ • Android → ARCore 6

Slide 7

Slide 7 text

ARKit + CoreLocation

Slide 8

Slide 8 text

ARKit+CoreLocation 8 • ARConfiguration.worldAlignment.gravit yAndHeadingΛࢦఆ͢Δ • ݪ఺ͷҐஔ৘ใͱARKitʹΑΓߏங͞Ε ͨੈքۭؒͷݪ఺͸૬ޓม׵Մೳ AR ࣮ۭؒ N N (x n , z n ) (lat n , lon n )

Slide 9

Slide 9 text

ARKit+CoreLocation 9 (0, 0) d [m] (x 1 , z 1 ) (lat 0 , lon 0 ) d [m] (lat 1 , lon 1 )

Slide 10

Slide 10 text

SCNNodeͷ഑ஔ • ϧʔτϥΠϯ (SCNPlane) • ؃൘ (3D) • ͚Μ͘͞+ΰʔϧϐϯ(3D) • ଍੻ (SCNPlane) 10

Slide 11

Slide 11 text

ϧʔτϥΠϯ 11

Slide 12

Slide 12 text

ϧʔτϥΠϯ 12 position eulerAngles.y

Slide 13

Slide 13 text

؃൘ 13

Slide 14

Slide 14 text

؃൘ 14 position

Slide 15

Slide 15 text

؃൘ 15 position

Slide 16

Slide 16 text

؃൘ 16 position • ϚʔδϯΛઃ͚ͯݟ΍͍͢ํ޲ʹճస • ౦੢ͲͪΒʹ഑ஔ͢Δ͔͸ɺਐߦํ޲ ͱ࣍ͷํ޲ͱͷࠩ෼͔Β൑அ͍ͯ͠Δ

Slide 17

Slide 17 text

଍੻ 17

Slide 18

Slide 18 text

଍੻ 18 position

Slide 19

Slide 19 text

଍੻ 19 position • ARSCNView͔ΒऔΕΔ pointOfViewͷpositionΛऔಘ • ݱࡏҐஔͷ࠲ඪΛ΋ͱʹҠಈڑ཭ ͱ֯౓Λܭࢉ • ଍੻͸ϥϯμϜͰग़͢Α͏ʹ materialʹઃఆ͍ͯ͠ΔUIImageΛ ಈతʹઃఆ͍ͯ͠Δ

Slide 20

Slide 20 text

͚Μ͘͞+ΰʔϧϐϯ 20 position SCNBillboardConstrain t

Slide 21

Slide 21 text

LocationInfoProvider 21 public protocol LocationInfoProvidable { func location(completion: @escaping (CLLocation?)->()) func nearbyRoutePoint(from origin: SCNVector3) -> SCNVector3? weak var delegate: LocationInfoProviderDelegate? { get set } 
 } protocol LocationInfoProviderDelegate: class { func locationInfoProvider(_ provider: LocationInfoProvidable, requestUpdateHeading heading: CLHeading) func ;ocationInfoProvider(_ provider: LocationInfoProvidable, requestUpdateLocation location: CLLocation, oldLocation: CLLocation?) 
 }

Slide 22

Slide 22 text

LocationInfoProvider 22 locationInfoProvider.location { [weak self] location in guard let origin = location else { self?.displayError() return } self?.addNodes(origin: origin) }

Slide 23

Slide 23 text

େྔͷSCNNodeͷ௥Ճ 23 func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { // 5ͭͣͭ௥Ճ͢Δ } self.navigationView.worldNode.addScheduledNodes(quantity: 5) func addObjects(origin: CLLocation) { self.navigationView.origin = origin let routeLineNodes = routeNodes(withCoordinates: self.coordinates) self.navigationView.scheduleNodes(routeLineNodes, priority: .high) } // ARSCNViewDelegate

Slide 24

Slide 24 text

ଞʹ΋… 24 • GPSɺిࢠίϯύεɺΧϝϥͷҐஔΛར ༻ۭͨؒ͠Ґஔิਖ਼ • ARϞʔυͰఆٛ͢Δۭؒͷ෼ׂํ๏ • SCNPlaneͷͭͳ͗໨ͷิਖ਼ ͳͲͳͲ

Slide 25

Slide 25 text

Fin