From fc14dcdf8d6656cb3efe384446c1974981ede875 Mon Sep 17 00:00:00 2001 From: norangebit Date: Sat, 19 Jan 2019 12:39:13 +0100 Subject: [PATCH] Impaginazione snippet --- src/chapter3.0.md | 2 +- src/chapter3.1.md | 31 ++++++++++++++++++------------- src/chapter3.2.md | 38 +++++++++++++++++++++++--------------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/chapter3.0.md b/src/chapter3.0.md index 32b2184..a532ef3 100644 --- a/src/chapter3.0.md +++ b/src/chapter3.0.md @@ -19,7 +19,7 @@ android { Sempre nel file per il build del progetto è necessario aggiungere la dipendenza di Sceneform. ```gradle -implementation "com.google.ar.sceneform.ux:sceneform-ux:1.6.0" +implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.6.0' ``` Inoltre nell'Android Manifest[^manifest] va dichiarato l'utilizzo del permesso della fotocamera[^camera] e l'utilizzo di ARCore[^arcore]. diff --git a/src/chapter3.1.md b/src/chapter3.1.md index cc89b41..7c7ce85 100644 --- a/src/chapter3.1.md +++ b/src/chapter3.1.md @@ -14,13 +14,15 @@ L'importazione del modello all'interno del progetto di Android Studio è stato e ### Creazione del database Il database contenente tutte le immagini che si desidera far riconosce all'applicazione, può essere creato sia a priori, sia a tempo di esecuzione. -Per la prima soluzione Google mette a disposizione *The arcoreimag tool*, un software a linea di comando, che oltre a creare il database, si occupa anche di valutare l'immagine. +Per la prima soluzione Google mette a disposizione *The arcoreimage tool*, un software a linea di comando, che oltre a creare il database, si occupa anche di valutare l'immagine. -Dato che nel caso specifico si vuole far riconoscere un'unica immagine, si è optato per la generazione del database a runtime. +Nel caso specifico si vuole far riconoscere un'unica immagine, quindi si è optato per la generazione del database a tempo di esecuzione. In particolare quest'operazione avviene mediante la funzione `setupAugmentedImageDb`. ```kotlin -private fun setupAugmentedImageDb (config: Config): Boolean { +private fun setupAugmentedImageDb ( + config: Config +): Boolean { val image = loadImage(IMAGE_FILE_NAME) ?: return false val augmentedImageDb = AugmentedImageDatabase(session) @@ -35,22 +37,22 @@ private fun setupAugmentedImageDb (config: Config): Boolean { Il riconoscimento dell'immagine non può avvenire mediate l'utilizzo di una callback in quanto ARCore non permette di registrare un listener all'evento. Risulta dunque evidente che la verifica dell'avvenuto match sarà delegata allo sviluppatore. -Per fare ciò si è usato il metodo `addOnUpdateListener` dell'oggetto `Scene`, che permette di eseguire un pezzo di codice ogni qual volta la scena viene aggiornata. +Per fare ciò si è usato il metodo `addOnUpdateListener` dell'oggetto `Scene`, che permette di eseguire uno *snippet* di codice ogni qual volta la scena viene aggiornata. ```kotlin override fun onCreate(savedInstanceState: Bundle?) { - //... - - arSceneView.scene.addOnUpdateListener(this::detectAndPlaceAugmentedImage) - - //... + // ... + arSceneView.scene.addOnUpdateListener( + this::detectAndPlaceAugmentedImage + ) + // ... } ``` Dove la funzione `detectAndPlaceAugmentedImage` si occupa di verificare la presenza di un match e nel caso di un riscontro positivo, dell'aggiunta dell'oggetto virtuale alla scena. ```kotlin -private fun detectAndPlaceAugmentedImage(frameTime: FrameTime) { +fun detectAndPlaceAugmentedImage(frameTime: FrameTime) { if (isModelAdded) return @@ -60,7 +62,8 @@ private fun detectAndPlaceAugmentedImage(frameTime: FrameTime) { .find { it.name.contains(IMAGE_NAME) } ?: return - val augmentedImageAnchor = augmentedImage.createAnchor(augmentedImage.centerPose) + val augmentedImageAnchor = augmentedImage + .createAnchor(augmentedImage.centerPose) buildRenderable(this, Uri.parse(MODEL_NAME)) { addTransformableNodeToScene( @@ -78,7 +81,7 @@ Il settaggio del flag `isModelAdded` al valore booleano di vero, si rende necess ### Rendering del modello -Il rendering del modello avviene attraverso la funzione `buildRenderable` che a sua volta chiama la funzione di libreria `ModelRenderable.builder()`. +Il rendering del modello avviene attraverso il metodo `buildRenderable` che a sua volta chiama la funzione di libreria `ModelRenderable.builder`. Poiché quest'ultima è un operazione onerosa viene restituito un `Future`[^future] che racchiude il `Renderable` vero e proprio. L'interazione con l'oggetto concreto avviene mediante una callback che è possibile specificare attraverso il metodo `thenAccept`. @@ -113,7 +116,9 @@ fun addTransformableNodeToScene( renderable: Renderable ) { val anchorNode = AnchorNode(anchor) - val transformableNode = TransformableNode(arFragment.transformationSystem) + val transformableNode = TransformableNode( + arFragment.transformationSystem + ) transformableNode.renderable = renderable transformableNode.setParent(anchorNode) arFragment.arSceneView.scene.addChild(anchorNode) diff --git a/src/chapter3.2.md b/src/chapter3.2.md index 822af0c..d6d83ea 100644 --- a/src/chapter3.2.md +++ b/src/chapter3.2.md @@ -21,9 +21,11 @@ Sceneform ci permette di personalizzare il comportamento al verificarsi di quest ```kotlin override fun onCreate(savedInstanceState: Bundle?) { - //... - arFragment.setOnTapArPlaneListener(this::fetchAndPlaceModel) - //... + // ... + arFragment.setOnTapArPlaneListener( + this::fetchAndPlaceModel + ) + // ... } ``` @@ -49,7 +51,7 @@ private fun fetchAndPlaceModel( ### Fetching del model -Il recupero del modello avviene attraverso la funzione `fetchModel`, che a sua volta chiama la funzione di libreria `RenderableSource.builder()`. +Il recupero del modello avviene attraverso la funzione `fetchModel`, che a sua volta chiama la funzione di libreria `RenderableSource.builder`. ```kotlin fun fetchModel( @@ -57,8 +59,14 @@ fun fetchModel( source: Uri ) : RenderableSource { return RenderableSource.builder() - .setSource(context, source, RenderableSource.SourceType.GLTF2) - .setRecenterMode(RenderableSource.RecenterMode.ROOT) + .setSource( + context, + source, + RenderableSource.SourceType.GLTF2 + ) + .setRecenterMode( + RenderableSource.RecenterMode.ROOT + ) .build() } ``` @@ -76,15 +84,15 @@ fun buildRenderable( modelUri: Uri, onSuccess: (renderable: Renderable) -> Unit ) { - ModelRenderable.builder() - .setRegistryId(modelUri) - .setSource(context, model) - .build() - .thenAccept(onSuccess) - .exceptionally { - Log.e("SCENEFORM", "unable to load model", it) - return@exceptionally null - } + ModelRenderable.builder() + .setRegistryId(modelUri) + .setSource(context, model) + .build() + .thenAccept(onSuccess) + .exceptionally { + Log.e("SCENEFORM", "unable to load model", it) + return@exceptionally null + } } ```