Slide 1

Slide 1 text

Mobile AR with ARCore Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 2

Slide 2 text

https://9to5mac.com/2018/05/16/comment-stop-using-ar-as-a-gimmick/

Slide 3

Slide 3 text

Transformative AR Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 4

Slide 4 text

Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 5

Slide 5 text

Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 6

Slide 6 text

MERGE Cube https://mergevr.com/cube

Slide 7

Slide 7 text

Microsoft HoloLens https://www.engadget.com/2017/11/01/microsoft-hololens-hard-hat-european-expansion/

Slide 8

Slide 8 text

Magic Leap Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 9

Slide 9 text

Transformative AR Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 10

Slide 10 text

ARCore from Google https://developers.google.com/ar

Slide 11

Slide 11 text

Motion Tracking https://developers.google.com/ar/discover/concepts

Slide 12

Slide 12 text

Environmental understanding https://developers.google.com/ar/discover/concepts

Slide 13

Slide 13 text

Light estimation https://developers.google.com/ar/discover/concepts

Slide 14

Slide 14 text

User interaction Oriented Points Anchors and Trackables Augmented Images Cloud Anchors Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 15

Slide 15 text

Anchors Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 16

Slide 16 text

Getting started with ARCore (Android) Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 17

Slide 17 text

override fun onResume() { super.onResume() val arCoreApk = ArCoreApk.getInstance() if (!arCoreApk.checkAvailability(this).isSupported()) { // Not supported - notify user! return } if (arCoreApk.requestInstall(this, true) == ArCoreApk.InstallStatus.INSTALL_REQUESTED)) { // Installation needed - activity will pause return } // Everything is ok to go! } Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 18

Slide 18 text

Sceneform (Android) Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 19

Slide 19 text

Sceneform → High-level scenegraph API → Realistic Physical Based Rendering using Filament → Android Studio plugin Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 20

Slide 20 text

Filament https://github.com/google/filament

Slide 21

Slide 21 text

Sceneform dependencies { // Provides ARCore Session and related resources. implementation 'com.google.ar:core:1.5.0' // Provides ArFragment, and other UX resources. implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.5.1' // Alternatively, use ArSceneView without the UX dependency. implementation 'com.google.ar.sceneform:core:1.5.1' } Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 22

Slide 22 text

Sceneform Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 23

Slide 23 text

Sceneform val arFragment = fragmentManager .findFragmentById(R.id.ux_fragment) as ArFragment? arFragment?.setOnTapArPlaneListener { hitResult, plane, motionEvent -> // Create new anchor and node val anchor = hitResult.createAnchor() val anchorNode = AnchorNode(anchor) // Add to the scene anchorNode.setParent(arFragment.arSceneView.scene) // TODO Add content to the new anchor... } Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 24

Slide 24 text

Scneeform - Display models arFragment?.setOnTapArPlaneListener { hitResult, plane, motionEvent -> ModelRenderable.builder() .setSource(this, Uri.parse("earth.sfb")) .build() .thenAccept { val anchor = hitResult.createAnchor() val anchorNode = AnchorNode(anchor) val transformableNode = TransformableNode(arFragment.transformationSystem) .apply { setParent(anchorNode) renderable = it } anchorNode.addChild(transformableNode) anchorNode.setParent(arFragment.arSceneView.scene) } } Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 25

Slide 25 text

Sceneform - Display Android views Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 26

Slide 26 text

Sceneform - Display Android views arFragment?.setOnTapArPlaneListener { hitResult, plane, motionEvent -> ViewRenderable.builder() .setView(this, R.layout.simple_form) .build() .thenAccept { card -> val anchor = hitResult.createAnchor() val anchorNode = AnchorNode(anchor) TransformableNode(arFragment.transformationSystem).apply { setParent(anchorNode) renderable = card select() } anchorNode.setParent(arFragment.arSceneView.scene) card.view.findViewById(R.id.okBtn).setOnClickListener { arFragment.arSceneView.scene.removeChild(anchorNode) anchor.detach() } } Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 27

Slide 27 text

Augmented Images Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 28

Slide 28 text

Configure Augmented Images // ARCore session sestup val session = Session(this) val config = Config(session) // Open image database val inputStream = context.assets.open("my_images_db.imgdb") val imageDatabase = AugmentedImageDatabase.deserialize(inputStream); // Enable image tracking config.setAugmentedImageDatabase(imageDatabase); session.configure(config); Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 29

Slide 29 text

Track images // in onDrawFrame() val frame = session.update() val updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage::class.java) updatedAugmentedImages.forEach { when (it.trackingState) { TrackingState.PAUSE -> // Detected, but not yet tracked TrackingState.TRACKING -> // Tracking! Create an anchor TrackingState.STOPPED -> // Remove anchor } } Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 30

Slide 30 text

Cloud Anchors Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 31

Slide 31 text

Cloud Anchors Moble AR with ARCore - @ErikHellman, Øredev 2018

Slide 32

Slide 32 text

Moble AR with ARCore - @ErikHellman, Øredev 2018