init chapter3.2
This commit is contained in:
parent
a1d0be3723
commit
81ebc85722
92
src/chapter3.2.md
Normal file
92
src/chapter3.2.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
## Runtime fetching models
|
||||||
|
|
||||||
|
Lo scopo di questa seconda applicazione è mostrare come sia possibile recuperare i modelli da renderizzare durante l'esecuzione dell'applicazione.
|
||||||
|
Questa funzione risulta particolarmente utile quando si deve rilasciare un'applicazione che sfrutta un numero elevato di modelli e non si vuole appesantire il volume del file *apk*[^apk].
|
||||||
|
Inoltre è possibile aggiungere nuovi modelli, o aggiornare quelli vecchi, senza dover aggiornare l'applicazione, ma lavorando esclusivamente lato server.
|
||||||
|
|
||||||
|
Per quest'applicazione oltre alle configurazioni già viste in precedenza dobbiamo aggiungere una nuova dipendenza che include le funzioni necessarie per il fetching del modello.
|
||||||
|
|
||||||
|
```gradle
|
||||||
|
implementation 'com.google.ar.sceneform:assets:1.6.0'
|
||||||
|
```
|
||||||
|
|
||||||
|
Inoltre nell'AndroidManifest bisogna aggiungere il permesso per accedere alla rete.
|
||||||
|
|
||||||
|
### Interazione con l'utente
|
||||||
|
|
||||||
|
L'interazione con l'utente avviene mediante un tocco sul display.
|
||||||
|
Sceneform ci permette di personalizzare il comportamento al verificarsi di questo evento tramite un listener.
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
//...
|
||||||
|
arFragment.setOnTapArPlaneListener(this::fetchAndPlaceModel)
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dove la funzione `fetchAndPlaceModel` si occupa di recuperare il modello e renderizzarlo.
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
private fun fetchAndPlaceModel(
|
||||||
|
hitResult: HitResult,
|
||||||
|
plane: Plane,
|
||||||
|
motionEvent: MotionEvent
|
||||||
|
) {
|
||||||
|
val modelUri = Uri.parse(MODEL_SOURCE)
|
||||||
|
val fetchedModel = fetchModel(this, modelUri)
|
||||||
|
buildRenderable(this, fetchedModel, modelUri) {
|
||||||
|
addTransformableNodeToScene(
|
||||||
|
arFragment,
|
||||||
|
hitResult.createAnchor(),
|
||||||
|
it
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fetching del model
|
||||||
|
|
||||||
|
Il recupero del modello avviene attraverso la funzione `fetchModel`.
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
fun fetchModel(
|
||||||
|
context: Context,
|
||||||
|
source: Uri
|
||||||
|
) : RenderableSource {
|
||||||
|
return RenderableSource.builder()
|
||||||
|
.setSource(context, source, RenderableSource.SourceType.GLTF2)
|
||||||
|
.setRecenterMode(RenderableSource.RecenterMode.ROOT)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Attualmente[^sceneform-1.6] Sceneform supporta unicamente il fetching di modelli gLTF.
|
||||||
|
|
||||||
|
### Rendering e aggiunta del modello
|
||||||
|
|
||||||
|
Il rendering del modello avviene tramite la funzione `buildRenderable`, che è molto simile a quella utilizzata nel progetto precedente, con la differenza che in questo caso deve essere passato anche il modello che si è recuperato in precedenza.
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
fun buildRenderable(
|
||||||
|
context: Context,
|
||||||
|
model: RenderableSource,
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
L'aggiunta del modello renderizzato alla scena avviene mediante la medesima funzione `addTransformableNodeToScene` vista in precedenza.
|
||||||
|
|
||||||
|
[^sceneform-1.6]: Sceneform 1.6.0.
|
||||||
|
[^apk]: Formato delle applicazioni android.
|
Loading…
Reference in New Issue
Block a user