building collaborative ar experiences · multi-user experiences in arkit 2 recap user1 user2....

100
© 2019 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. #WWDC19 Kuen-han Lin, ARKit Engineering David Paschich, Tools Foundation Building Collaborative AR Experiences

Upload: others

Post on 24-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

© 2019 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

#WWDC19

Kuen-han Lin, ARKit Engineering David Paschich, Tools Foundation

•Building Collaborative AR Experiences

Page 2: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 3: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 4: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

•Collaborative Session •ARAnchor Best Practice for Multi-User AR •SwiftStrike — A New Multiplayer AR Experience

Page 5: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

•Collaborative Session

Page 6: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Saving and Loading Map in ARKit 2 Recap

ARWorldMap data • Map of sparse 3D landmarks • List of named ARAnchors

Page 7: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Multi-User Experiences in ARKit 2 Recap

User1 User2

Page 8: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Multi-User Experiences in ARKit 2 Recap

User1 User2

Page 9: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Multi-User Experiences in ARKit 2 Recap

User1 User2

Page 10: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Multi-User Experiences in ARKit 2 Recap

User1 User2

Page 11: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Collaborative Session

Live multi-user AR experience

Continuously share ARAnchors and map data

No host user

Page 12: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 13: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 14: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 15: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 16: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 17: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 18: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

Page 19: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

Page 20: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

User 2 External Map

User 1 External Map

Page 21: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

User 2 External Map

User 1 External Map

Page 22: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

User 2 External Map

User 1 External Map

Page 23: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

User 2 External Map

User 1 External Map

Page 24: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

User 2 External Map

User 1 External Map

Page 25: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

User 2 External Map

User 1 External Map

Page 26: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Coordinates in Collaborative Session

Page 27: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Collaborative Session Flow Set up communication

User 1 Set up Network

Set up Network

ARSession Starts

Localize User 2 Map

Localize User 1 Map

Receive User 2

ARAnchor

Receive User 1

ARAnchor

Collaboration Data

User 2 ARSession Starts

Collaboration Data

Page 28: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Collaborative Session Flow Transmit collaboration data

User 1 Set up Network

Set up Network

ARSession Starts

Localize User 2 Map

Localize User 1 Map

Receive User 2

ARAnchor

Receive User 1

ARAnchor

Collaboration Data

User 2 ARSession Starts

Collaboration Data

Page 29: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Collaborative Session

// Create world tracking configuration let config = ARWorldTrackingConfiguration()

// Enable collaborative session config.isCollaborationEnabled = true

// Run the configuration session.run(config)

Page 30: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Collaborative Session

// Create world tracking configuration let config = ARWorldTrackingConfiguration()

// Enable collaborative session config.isCollaborationEnabled = true

// Run the configuration session.run(config)

Page 31: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Collaborative Session

// Create world tracking configuration let config = ARWorldTrackingConfiguration()

// Enable collaborative session config.isCollaborationEnabled = true

// Run the configuration session.run(config)

Page 32: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Collaborative Session

// Create world tracking configuration let config = ARWorldTrackingConfiguration()

// Enable collaborative session config.isCollaborationEnabled = true

// Run the configuration session.run(config)

Page 33: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARSession delegate function to output ARCollaborationData func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) { // Transmit Data representation of the data to all other participants using MPC do { try self.mpcSession.send(data.data, toPeers: self.peerIds, with: .reliable) } catch { // Re-transmit the data if failed } }

// MPC delegate function when receiving collaboration data from other users func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) { // Pass the received data to ARSession self.arSession.update(data: ARSession.CollaborationData(data: data)) }

Page 34: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARSession delegate function to output ARCollaborationData func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) { // Transmit Data representation of the data to all other participants using MPC do { try self.mpcSession.send(data.data, toPeers: self.peerIds, with: .reliable) } catch { // Re-transmit the data if failed } }

// MPC delegate function when receiving collaboration data from other users func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) { // Pass the received data to ARSession self.arSession.update(data: ARSession.CollaborationData(data: data)) }

Page 35: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARSession delegate function to output ARCollaborationData func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) { // Transmit Data representation of the data to all other participants using MPC do { try self.mpcSession.send(data.data, toPeers: self.peerIds, with: .reliable) } catch { // Re-transmit the data if failed } }

// MPC delegate function when receiving collaboration data from other users func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) { // Pass the received data to ARSession self.arSession.update(data: ARSession.CollaborationData(data: data)) }

Page 36: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Collaborative Session Flow Start shared AR experience

User 1 Set up Network

Set up Network

ARSession Starts

Localize User 2 Map

Localize User 1 Map

Receive User 2

ARAnchor

Receive User 1

ARAnchor

Collaboration Data

User 2 ARSession Starts

Collaboration Data

Page 37: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Collaborative Session Flow Start shared AR experience

User 1 Set up Network

Set up Network

ARSession Starts

Localize User 2 Map

Localize User 1 Map

Receive User 2

ARAnchor

Receive User 1

ARAnchor

Collaboration Data

User 2 ARSession Starts

Collaboration Data

Page 38: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

ARAnchor in Collaborative Session

ARAnchor • Synchronized lifetime • Session identifier • Subclass ARAnchors are not shared

Introducing RealityKit and Reality Composer WWDC 2019

Page 39: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARAnchor in collaborative session

// ARSession delegate function when an ARAnchor is added. func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { for anchor in anchors { // Use session identifier to determine creator of the ARAnchor

if anchor.sessionIdentifier == session.identifier { // Self-placed ARanchor } else { // ARAnchor from another participant } } }

Page 40: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARAnchor in collaborative session

// ARSession delegate function when an ARAnchor is added. func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { for anchor in anchors { // Use session identifier to determine creator of the ARAnchor

if anchor.sessionIdentifier == session.identifier { // Self-placed ARanchor } else { // ARAnchor from another participant } } }

Page 41: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARSession delegate function when an ARAnchor is removed. func session(_ session: ARSession, didRemove anchors: [ARAnchor]) { for anchor in anchors { // Use session identifier to determine creator of the ARAnchor if anchor.sessionIdentifier == session.identifier { // Self-placed ARanchor } else { // ARAnchor from another participant } } }

Page 42: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// ARSession delegate function when an ARAnchor is removed. func session(_ session: ARSession, didRemove anchors: [ARAnchor]) { for anchor in anchors { // Use session identifier to determine creator of the ARAnchor if anchor.sessionIdentifier == session.identifier { // Self-placed ARanchor } else { // ARAnchor from another participant } } }

Page 43: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

ARParticipantAnchor

ARParticipantAnchor • Position of other user • Update at high frame rate • Created after localizing other user’s map

Page 44: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Practical Advice for Localizing Other Users

Shared AR experience starts after seeing same area

Page 45: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Practical Advice for Localizing Other Users

Shared AR experience starts after seeing same area

Approach other user to have same camera perspective

Page 46: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Practical Advice for Localizing Other Users

Shared AR experience starts after seeing same area

Approach other user to have same camera perspective

Stay in map-tracking status ARFrame.WorldMappingStatus.mapped

Page 47: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 48: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 49: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 50: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 51: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

•ARAnchor Best Practice forMulti-User AR

Page 52: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Behind the Scenes — ARWorldMap

Internal tracking data • Map of sparse 3D landmarks • Camera poses

Page 53: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Behind the Scenes — ARWorldMap

Internal tracking data • Map of sparse 3D landmarks • Camera poses

Page 54: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Behind the Scenes — ARWorldMap

Internal tracking data • Map of sparse 3D landmarks • Camera poses

Landmarks are grouped based on camera view

Page 55: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Behind the Scenes — ARAnchor

ARAnchor • Global position against world

Page 56: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Behind the Scenes — ARAnchor

ARAnchor • Global position against world • Relative position against map

Page 57: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Best Practice for Using ARAnchor

Respond to anchor update delegate

Page 58: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Best Practice for Using ARAnchor

Respond to anchor update delegate

Page 59: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Best Practice for Using ARAnchor

Respond to anchor update delegate

Place 3D content near the ARAnchor

Page 60: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Best Practice for Using ARAnchor

Respond to anchor update delegate

Place 3D content near the ARAnchor

Page 61: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Best Practice for Using ARAnchor

Respond to anchor update delegate

Place 3D content near the ARAnchor

Multiple anchors for independent 3D content

Page 62: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Best Practice for Using ARAnchor

Respond to anchor update delegate

Place 3D content near the ARAnchor

Multiple anchors for independent 3D content

Page 63: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

•SwiftStrike — A New Multiplayer AR Experience

David Paschich, Tools Foundation

Page 64: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Inside SwiftShot: Creating an AR Game WWDC 2018

SwiftStrike — A New Multiplayer AR Experience

Inspired by SwiftShot

All-new experience for 2019

Built with RealityKit and ARKit 3

SwiftStrike Tabletop available now

Page 65: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

•RealityKit networking •Physics simulation •SwiftStrike game design •

Page 66: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

RealityKit Networking

Based on entity-component architecture

All state synchronized, including physics!

Custom components for app/game logic

Uses MultipeerConnectivity as network layer

Create network session, hand to ARView

Building Apps with RealityKit Wednesday, 10:00

Page 67: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Different Roles

First device acts as “host”

Controls game state, physics simulation

Other devices participate

Page 68: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Custom Components in RealityKit

Define your own components to store application state

Register components before instantiating ARView

Implement Codable to enable synchronization

Page 69: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Use Case — Starting the Game

Match object tracks whether enough players are ready to start the game

State maintained on host, synced to clients

Component maintains full log

Page 70: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 71: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 72: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Custom component for game start

struct MatchStateComponent: Component, Codable { struct Transition: Codable { var date: Date var state: MatchOutput } var transitions = [Transition]() }

// Registering the component, in application(_:didFinishLaunchingWithOptions:) MatchStateComponent.self.registerComponent()

// On client class MatchObserver { var matchOutputEvents: AnyPublisher<MatchOutput, Never> }

Page 73: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Custom component for game start

struct MatchStateComponent: Component, Codable { struct Transition: Codable { var date: Date var state: MatchOutput } var transitions = [Transition]() }

// Registering the component, in application(_:didFinishLaunchingWithOptions:) MatchStateComponent.self.registerComponent()

// On client class MatchObserver { var matchOutputEvents: AnyPublisher<MatchOutput, Never> }

Page 74: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Custom component for game start

struct MatchStateComponent: Component, Codable { struct Transition: Codable { var date: Date var state: MatchOutput } var transitions = [Transition]() }

// Registering the component, in application(_:didFinishLaunchingWithOptions:) MatchStateComponent.self.registerComponent()

// On client class MatchObserver { var matchOutputEvents: AnyPublisher<MatchOutput, Never> }

Page 75: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

// Custom component for game start

struct MatchStateComponent: Component, Codable { struct Transition: Codable { var date: Date var state: MatchOutput } var transitions = [Transition]() }

// Registering the component, in application(_:didFinishLaunchingWithOptions:) MatchStateComponent.self.registerComponent()

// On client class MatchObserver { var matchOutputEvents: AnyPublisher<MatchOutput, Never> }

Page 76: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ray CameraInfo GameVelocity HitCatapult SlingData GrabInfo LeverMove PhysicsSyncData CollisionSoundData PhysicsSyncSceneData PhysicsSyncSeneDataDelegate

GamePhysicsSmoothComponent SlingshotComponent GameBoardDescription GameBoardLocation LevelConfiguration LevelInfo LeverMove BitStreamEncodable BitStreamDecodable WriteableBitStream ReadableBitStream

Page 77: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ray CameraInfo GameVelocity HitCatapult SlingData GrabInfo LeverMove PhysicsSyncData CollisionSoundData PhysicsSyncSceneData PhysicsSyncSeneDataDelegate

GamePhysicsSmoothComponent SlingshotComponent GameBoardDescription GameBoardLocation LevelConfiguration LevelInfo LeverMove BitStreamEncodable BitStreamDecodable WriteableBitStream ReadableBitStream

Page 78: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ray CameraInfo GameVelocity HitCatapult SlingData GrabInfo LeverMove PhysicsSyncData CollisionSoundData PhysicsSyncSceneData PhysicsSyncSeneDataDelegate

GamePhysicsSmoothComponent SlingshotComponent GameBoardDescription GameBoardLocation LevelConfiguration LevelInfo LeverMove BitStreamEncodable BitStreamDecodable WriteableBitStream ReadableBitStream

Page 79: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Physics

Physics state synchronization handled by RealityKit

Configure physics properties via components • Rigid bodies • Collision masks • Mass, friction, restitution (“bounciness”)

Host device owns simulation

Client devices interpolate between updates

Page 80: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Bowling Pin

Page 81: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Bowling Pin

Page 82: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Bowling Pin

Page 83: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Bowling Pin

Page 84: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

SwiftStrike Game Design

Designing for People Occlusion

On-site experience

Control mechanism

Page 85: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

People Occlusion

SwiftStrike designed with this in mind

Opens up new experiences

Page 86: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

SwiftStrike On-Site Experience

Full scale experience

Floor features designed for quick localization

Page 87: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

SwiftStrike Control Mechanism

Device is your controller

Faster movement means larger push

Physics body in the scene • Ball bounces off people • Pins and ball bounce off each other • Pins don’t bounce off people

Page 88: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ownership of Player Paddle

Page 89: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ownership of Player Paddle

HostAnchorEntity

Page 90: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ownership of Player Paddle

Client PlayerLocationEntity

HostAnchorEntity

Page 91: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ownership of Player Paddle

Client PlayerLocationEntity

HostAnchorEntity

Page 92: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ownership of Player Paddle

Client PlayerLocationEntity

HostAnchorEntity

HostPaddleEntity

Page 93: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Ownership of Player Paddle

Client PlayerLocationEntity

HostAnchorEntity

HostPaddleEntity

Page 94: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 95: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 96: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 97: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”
Page 98: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

Summary

Collaborative Sessions enable new experiences

Use ARAnchors to attach content to the real world

SwiftStrike Tabletop available now!

Building AR Experiences with Reality Composer WWDC 2019

Page 99: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”

More Informationdeveloper.apple.com/wwdc19/610

ARKit Lab Thursday, 3:00

RealityKit and Reality Composer Lab Thursday, 3:00

Page 100: Building Collaborative AR Experiences · Multi-User Experiences in ARKit 2 Recap User1 User2. Multi-User Experiences in ARKit 2 Recap User1 User2. ... First device acts as “host”