correzioni professore
This commit is contained in:
parent
fe9f58da2f
commit
c44cdb99a1
@ -13,7 +13,7 @@ Volendo elaborare una definizione di questi concetti, usando un paragone cinemat
|
||||
Invece in *Iron Man*\cite{favreau:IronMan:2008} quando *Tony Stark* è in volo e gli vengono mostrate a video informazioni aggiuntive sta usando l'AR, mentre quando interagisce con gli ologrammi sta usando tecnologie di mixed reality.
|
||||
|
||||
Per una definizione più accurata possiamo ricorrere a quella elaborata nel 1994 da *Paul Milgram* e da alcuni suoi colleghi, che introducono il concetto di ***reality-virtuality continuum***\cite{milgram:AugmentedRealityClass:1994}.
|
||||
Nel loro lavoro hanno definito un segmento(vedi fig. \ref{rvc}) che ha ai propri estremi, da un lato l'ambiente reale, quello in cui viviamo, e dall'altro quello virtuale, completamente generato al computer.
|
||||
Nel loro lavoro hanno definito un segmento (vedi fig. \ref{rvc}) che ha ai propri estremi, da un lato l'ambiente reale, quello in cui viviamo, e dall'altro quello virtuale, completamente generato al computer.
|
||||
Esattamente a metà strada tra essi risiede la realtà mista, dove gli oggetti reali e virtuali convivono ed hanno pari valenza.
|
||||
|
||||
Inoltre hanno definito due stati intermedi.
|
||||
@ -21,7 +21,7 @@ Inoltre hanno definito due stati intermedi.
|
||||
- ***\ac{AV}***:
|
||||
Stato in cui alcuni elementi reali entrano in contatto con un mondo totalmente generato al computer.
|
||||
Sebbene il termine AV sia quello meno conosciuto tra quelli citati, probabilmente tutti noi ne abbiamo avuto esperienza diretta.
|
||||
Basti pensare a tecnologie come la *Nintendo Wii*, al *Kinect*, o ai più moderni giochi per smartphone basati su giroscopio e accelerometro, in cui il movimento(reale) del giocatore va ad influenzare il gioco.
|
||||
Basti pensare a tecnologie come la *Nintendo Wii*, al *Kinect*, o ai più moderni giochi per smartphone basati su giroscopio e accelerometro, in cui il movimento (reale) del giocatore va ad influenzare il gioco.
|
||||
|
||||
- ***Augmented Reality***:
|
||||
Stato in cui alcuni elementi virtuali coesistono nel mondo reale, andando ad ampliarne i confini.
|
||||
@ -35,7 +35,7 @@ Obiettivo di questa macchina era estendere l'esperienza audio-visiva del cinema
|
||||
Durante la visione lo spettatore veniva immerso nell'azione grazie ad una visone 3D e all'audio stereofonico, inoltre poteva percepire il vento, le vibrazioni, generate tramite l'inclinazione della macchina, e addirittura gli odori.
|
||||
Nonostante le potenzialità della macchina[^cinema-4d], per mancanza di investitori, *Heilig* fu costretto ad abbandonare il suo progetto.
|
||||
|
||||
Una prima applicazione di AR *moderna* invece la troviamo nel 1968 quando *Ivan Sutherland* costruisce il primo visore(vedi fig. \ref{sutherland}) in grado di aggiungere elementi generati dal computer alla visione umana\cite{sutherland:HeadmountedThreedimensionalDisplay:1968}.
|
||||
Una prima applicazione di AR *moderna* invece la troviamo nel 1968 quando *Ivan Sutherland* costruisce il primo visore (vedi fig. \ref{sutherland}) in grado di aggiungere elementi generati dal computer alla visione umana\cite{sutherland:HeadmountedThreedimensionalDisplay:1968}.
|
||||
Mentre per il battesimo si dovrà attendere il 1990 quanto *Tom Caudell* introduce per la prima volta il termine *augmented reality*.
|
||||
|
||||
![Vista frontale del visore di Sutherland](figures/headmounted2.jpg){#sutherland width=400 height=250px}
|
||||
@ -48,8 +48,8 @@ A partire dalla fine degli anni 90 le tecnologie AR hanno trovato sempre maggior
|
||||
Infatti è proprio a cavallo tra secondo e terzo millennio, che per la prima volta, durante una partita di \ac{NFL}, la linea gialla del *primo down* viene generata da un computer.
|
||||
|
||||
Negli ultimi anni il fiorente progresso tecnologico ha consentito la diffusione sempre maggiore di apparecchi che permettono di fondere elementi virtuali con la realtà che li circonda.
|
||||
Uno dei prodotti più riusciti sono senza dubbio i *Google Glass*(vedi fig. \ref{googleglass})\cite{x:Glass:2019}, presentati al grande pubblico durante il Google I/O del 2013, hanno la forma di comuni occhiali, ma con l'aggiunta di un'appendice che racchiude una fotocamera e un prisma usato per ottenere un *head-up display*.
|
||||
L'interazione può avvenire sia tramite un touchpad(in grado di riprodurre audio mediante conduzione ossea[^conduzione-ossea]) sia mediante comandi vocali.
|
||||
Uno dei prodotti più riusciti sono senza dubbio i *Google Glass* (vedi fig. \ref{googleglass})\cite{x:Glass:2019}, presentati al grande pubblico durante il Google I/O del 2013, hanno la forma di comuni occhiali, ma con l'aggiunta di un'appendice che racchiude una fotocamera e un prisma usato per ottenere un *head-up display*.
|
||||
L'interazione può avvenire sia tramite un touchpad (in grado di riprodurre audio mediante conduzione ossea[^conduzione-ossea]) sia mediante comandi vocali.
|
||||
Grazie a quest'ultima caratteristica è possibile avere un'esperienza d'uso *hand-free* che li ha resi particolarmente utili in campo industriale e medico.
|
||||
|
||||
![Google Glass Enterprise Edition](figures/google_glass.jpeg){#googleglass width=400 height=250px}
|
||||
@ -64,7 +64,7 @@ I *Tango devices* avevano la forma e le funzionalità di un normale smartphone,
|
||||
Sebbene nel 2016 sia stata rimossa la dicitura *project* e sono stati commercializzati alcuni dispositivi di Lenovo e Asus, *Tango* non ha mai avuto grande successo né tra i produttori, né tra i consumatori.
|
||||
|
||||
Il mancato successo è stato determinato da una parte, dalla tendenza di Google a lanciare prodotti in eterna beta e dall'altra, dal costante miglioramento degli algoritmi di visione digitale che permettevano di ottenere risultati soddisfacenti anche su smartphone con hardware standard, e quindi più a buon mercato.
|
||||
La soluzione di Google, da progetto avveniristico, si è ritrovata ad essere limitata ed acerba per il settore professional, in cui stavano emergendo soluzioni decisamente più potenti ed interessanti come *Microsoft HoloLens*[^mixed-reality](vedi fig. \ref{hololens})\cite{microsoft:MicrosoftHoloLens:2019}, ma troppo costosa e limitante per quello consumers.
|
||||
La soluzione di Google, da progetto avveniristico, si è ritrovata ad essere limitata ed acerba per il settore professional, in cui stavano emergendo soluzioni decisamente più potenti ed interessanti come *Microsoft HoloLens*[^mixed-reality] (vedi fig. \ref{hololens})\cite{microsoft:MicrosoftHoloLens:2019}, ma troppo costosa e limitante per quello consumers.
|
||||
|
||||
![Microsoft HoloLens](figures/hololens.jpg){#hololens width=400 height=250px}
|
||||
|
||||
@ -84,7 +84,7 @@ Questo tipo di AR oltre a riconoscere il pattern deve essere in grado anche di c
|
||||
L'efficacia oltre a dipendere dalla libreria utilizzata dipende anche dal dispositivo in uso e dal tipo di marker utilizzato.
|
||||
Infatti condizione necessaria per ottenere risultati soddisfacenti è l'utilizzo di immagini ricche di punti caratteristici o, nel caso di riconoscimento di oggetti tridimensionali, di modelli molto dettagliati.
|
||||
|
||||
Questa tecnologia è impiegata prevalentemente per aggiungere dei contenuti multimediali a libri o riviste(vedi fig. \ref{mbar}).
|
||||
Questa tecnologia è impiegata prevalentemente per aggiungere dei contenuti multimediali a libri o riviste (vedi fig. \ref{mbar}).
|
||||
Inoltre un impiego emergente è nel campo industriale, dove tramite opportuni modelli 3D di macchinari e impianti è possibile realizzare manuali e guide interattive.
|
||||
|
||||
![Tipica applicazione di *marker based AR*](figures/marker_based_ar.png){#mbar width=400 height=250px}
|
||||
@ -92,14 +92,14 @@ Inoltre un impiego emergente è nel campo industriale, dove tramite opportuni mo
|
||||
### Markerless AR
|
||||
|
||||
L'AR markerless, realizzata mediante degli algoritmi di tipo \ac{SLAM}, è il modo più efficace per renderizzare oggetti virtuali nel mondo reale.
|
||||
Con questa soluzione non è necessario fornire all'algoritmo informazioni di base per il riconoscimento, infatti riesce a capire(*Localization*) e ricordare(*mapping*) ambienti su cui non ha altre informazioni, se non quelle catturate in real-time dai sensori.
|
||||
Con questa soluzione non è necessario fornire all'algoritmo informazioni di base per il riconoscimento, infatti riesce a capire (*Localization*) e ricordare (*mapping*) ambienti su cui non ha altre informazioni, se non quelle catturate in real-time dai sensori.
|
||||
|
||||
Le maggiori applicazioni di questa tecnologia si hanno nel campo commerciale, basti pensare alla possibilità di provare un mobile o un quadro nel salotto di casa.
|
||||
Altro campo in cui hanno riscosso notevole successo è quello ludico e ricreativo.
|
||||
|
||||
### Location based AR
|
||||
|
||||
La location based AR, effettua il riconoscimento dell'ambiente mediante sensori di posizionamento, sia out-door(es. \ac{GPS}), sia in-door(es. Beacon Bluetooth[^beacon]).
|
||||
La location based AR, effettua il riconoscimento dell'ambiente mediante sensori di posizionamento, sia out-door (es. \ac{GPS}), sia in-door (es. Beacon Bluetooth[^beacon]).
|
||||
Generalmente questo tipo di AR non opera da sola, ma in simultanea ad una delle due tecnologie sopra citate.
|
||||
|
||||
La maggiore applicazione di queste tecnologie si ha nella navigazione in realtà aumentata. Un esempio è la possibilità di vedere percorsi virtuali tra le strade delle città d'arte.
|
||||
@ -110,7 +110,7 @@ La maggiore applicazione di queste tecnologie si ha nella navigazione in realtà
|
||||
|
||||
[^olfactory]: Si è soliti associare l'AR principalmente a contenuti audio-video, ma in realtà è un settore che comprende tutti e cinque i sensi. Un'ipotetica tecnologia, che dato in input un piatto, riesce a farci percepite il sapore e l'odore andrebbe ascritta comunque al campo dell'AR.
|
||||
|
||||
[^destructive]: Anche se meno conosciuta, la branca *de-costruttiva*, si pone l'obiettivo di rimuovere del contenuto dal mondo reale. Una delle applicazioni più interessanti, sebbene ancora in fase sperimentale, è la realizzazione di un AD blocker per il mondo reale \cite{vanhemert:ARExperimentThat:2015}. L'AR de-costruttiva resta ad oggi ancora marginale, sia per una carenza di idee di applicazione, sia perché espone ancora di più l'utente ai pericoli dell'AR che già hanno portato a dei decessi. Mediaticamente più interessanti sono state le morti ascrivibili a *Pokémon GO* \cite{pokemongodeathtracker:PokemonGODeath:2019}.
|
||||
[^destructive]: Anche se meno conosciuta, la branca *de-costruttiva*, si pone l'obiettivo di rimuovere del contenuto dal mondo reale. Una delle applicazioni più interessanti, sebbene ancora in fase sperimentale, è la realizzazione di un AD blocker per il mondo reale \cite{vanhemert:ARExperimentThat:2015}. L'AR de-costruttiva resta ad oggi ancora marginale, sia per una carenza di idee di applicazione, sia perché espone, più di quanto non succeda con l'AR costruttiva, l'utente ai pericoli dell'AR che già hanno portato a dei decessi. Mediaticamente più interessanti sono state le morti ascrivibili a *Pokémon GO* \cite{pokemongodeathtracker:PokemonGODeath:2019}.
|
||||
|
||||
[^mixed-reality]: Sebbene HoloLens sia un visore per la mixed reality, possiamo annoverarlo anche tra i dispositivi AR in quanto la realtà aumentata è una tecnologia abilitate per l'MR.
|
||||
|
||||
@ -118,4 +118,4 @@ La maggiore applicazione di queste tecnologie si ha nella navigazione in realtà
|
||||
|
||||
[^atap]: Divisione Advanced Technology And Projects di Google, precedentemente nota come Google X.
|
||||
|
||||
[^beacon]: Trasmettitore Bluetooth in grado di trasmettere ripetutamente un codice alfanumerico univoco(\ac{UUID}) che permette al dispositivo ricevente di localizzarsi in un ambiente chiuso.
|
||||
[^beacon]: Trasmettitore Bluetooth in grado di trasmettere ripetutamente un codice alfanumerico univoco (\ac{UUID}) che permette al dispositivo ricevente di localizzarsi in un ambiente chiuso.
|
||||
|
@ -11,7 +11,7 @@ ARCore è stata costruita intorno a tre caratteristiche principali\cite{googlear
|
||||
ARCore riesce ad estrapolare dall'immagine proveniente dalla fotocamera una serie di ***feature points***, ed usa questi punti per calcolare il proprio movimento rispetto all'ambiente.
|
||||
Queste informazioni, combinate con quelle provenienti dall'*inertial measurement unit*[^imu], permettono alla libreria di determinare la ***pose*** ovvero la posizione e l'orientamento del device.
|
||||
- **Environmental understanding**:
|
||||
ARCore ottiene continuamente nuove informazione sull'ambiente tramite i *feature points*, grazie ai quali è in grado di determinare le superfici piane(sia orizzontali che verticali) e i bordi di quest'ultime.
|
||||
ARCore ottiene continuamente nuove informazione sull'ambiente tramite i *feature points*, grazie ai quali è in grado di determinare le superfici piane (sia orizzontali che verticali) e i bordi di quest'ultime.
|
||||
Dato che le superfici piane sono determinate attraverso i *feature points*, la libreria incontra non poche difficoltà nel riconoscimento di superfici piane verticali monocromatiche come, ad esempio, i muri.
|
||||
- **Light estimation**:
|
||||
ARCore è in grado di comprendere come la luce illumina gli oggetti reali, mettendo a disposizione del programmatore un'\ac{API} per poter correggere l'immagine proveniente dalla fotocamera.
|
||||
@ -35,11 +35,11 @@ Questa operazione prende il nome di *hit test*.
|
||||
### Perché ARCore
|
||||
|
||||
La scelta di ARCore rispetto ad altri ambienti di sviluppo non è stata determinata da una supremazia tecnica.
|
||||
La costruzione di una rappresentazione interna dell'ambiente e il posizionamento in questo sono le caratteristiche su cui si erigono tutte le librerie di realtà aumentata markerless.
|
||||
Tant'è non è possibile notare una sostanziale differenza tra ARCore e la già citata ARKit, o l'altrettanto valida Vuforia\cite{vuforia:VuforiaAugmentedReality:2019}.
|
||||
La costruzione di una rappresentazione interna dell'ambiente e il posizionamento in questo sono le caratteristiche comuni a molte librerie di realtà aumentata markerless.
|
||||
Infatti non è possibile notare una sostanziale differenza tra ARCore e la già citata ARKit, o l'altrettanto valida Vuforia\cite{vuforia:VuforiaAugmentedReality:2019}.
|
||||
|
||||
Il campo in cui ARCore eccelle rispetto alla concorrenza invece è la gestione della luce.
|
||||
Questo punto di forza, però, viene abbondantemente compensato dall'impossibilità di riconoscere un oggetto reale[^image-recognition](sia esso statico che dinamico) dato un modello 3D.
|
||||
Questo punto di forza, però, viene abbondantemente compensato dall'impossibilità di riconoscere un oggetto reale[^image-recognition] (sia esso statico che dinamico) dato un modello 3D.
|
||||
Funzione disponibile sia su Vuforia, sia, dalla versione 2.0, su ARKit.
|
||||
|
||||
La prima ragione per cui si è scelto di approfondire lo studio di ARCore è la sua natura multi piattaforma, con buona parte dell'API condivisa dai due maggiori sistemi operativi mobili.
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Per poter realizzare delle applicazioni mediante ARCore e Sceneform sono necessarie una serie di configurazioni iniziali.
|
||||
|
||||
Requisito necessario al funzionamento di ARCore è una versione di Android uguale o superiore ad Android 7.0 Nougat(API level 24).
|
||||
Requisito necessario al funzionamento di ARCore è una versione di Android uguale o superiore ad Android 7.0 Nougat (API level 24).
|
||||
Inoltre se si sta lavorando su un progetto con API level minore di 26 è necessario esplicitare il supporto a Java 8 andando a modificare file `app/build.gradle`.
|
||||
|
||||
```gradle
|
||||
|
@ -1,6 +1,6 @@
|
||||
## Augmented images
|
||||
|
||||
Nel primo progetto d'esempio si è affrontato un classico problema di AR marker based, ovvero il riconoscimento di un'immagine preimpostata e il conseguente sovrapponimento di un oggetto virtuale.
|
||||
Nel primo progetto d'esempio si è affrontato un classico problema di AR marker based, ovvero il riconoscimento di un'immagine preimpostata e la sovrapposizione di un oggetto virtuale.
|
||||
Nel caso specifico si vuole riconoscere una foto del pianeta terra e sostituirvi un modello tridimensionale di essa.
|
||||
|
||||
### Aggiunta del modello
|
||||
|
@ -4,7 +4,7 @@ Nella seconda applicazione d'esempio viene mostrato come sia possibile recuperar
|
||||
Questa funzione risulta particolarmente utile quando si deve rilasciare un'applicazione che sfrutta numerosi modelli e non si vuole appesantire eccessivamente il volume del file *APK*.
|
||||
Inoltre concede maggiore libertà allo sviluppatore in quanto è possibile aggiungere nuovi modelli, o aggiornare quelli vecchi, senza dover operare sull'applicazione, ma lavorando esclusivamente lato server.
|
||||
|
||||
In questo caso specifico l'applicazione dovrà riconosce uno o più piani e in seguito ad un tocco dell'utente su di essi, mostrare un modello di *Andy*, la mascotte di Android(vedi fig. \ref{rfm}).
|
||||
In questo caso specifico l'applicazione dovrà riconosce uno o più piani e in seguito ad un tocco dell'utente su di essi, mostrare un modello di *Andy*, la mascotte di Android (vedi fig. \ref{rfm}).
|
||||
|
||||
Per quest'applicazione oltre alle configurazioni già viste in precedenza è necessario aggiungere una nuova dipendenza che include le funzioni necessarie per il fetching del modello.
|
||||
|
||||
|
@ -7,7 +7,7 @@ L'SDK di Sceneform fornisce due classi per adempiere a questo compito:
|
||||
- `MaterialFactory`: consente di creare un *"materiale"*, partendo o da un colore o da una texture[^texture] definita precedentemente.
|
||||
- `MaterialShape`: consente di creare delle semplici forme geometriche come cilindri, sfere e cuboidi.
|
||||
|
||||
Nel caso specifico è stata realizzata un'applicazione che in seguito al tocco dell'utente renderizza nella scena un oggetto dalla forma e dal colore *pseudo-casuali*(vedi fig. \ref{rbm}).
|
||||
Nel caso specifico è stata realizzata un'applicazione che in seguito al tocco dell'utente renderizza nella scena un oggetto dalla forma e dal colore *pseudo-casuali* (vedi fig. \ref{rbm}).
|
||||
Inoltre è stato aggiunto un ulteriore elemento di interazione con l'utente, che gli consente di cliccare sull'oggetto renderizzato, al fine di cambiare la tinta di quest'ultimo.
|
||||
|
||||
![Rendering di modelli costruiti a runtime](figures/rbm.png){#rbm width=225px height=400px}
|
||||
|
@ -3,7 +3,7 @@
|
||||
Quando si ha a che fare con più nodi presenti sulla scena può risultare utile verificare se due o più di questi si sovrappongono.
|
||||
In questo progetto viene mostrato come eseguire questo controllo mediante l'API di ARCore.
|
||||
|
||||
Per questo progetto si è utilizzata una rivisitazione dell'applicazione vista nel progetto precedente, con la differenza che l'aggiunta di un oggetto non è consentita se questo va in collisione con un altro già presente nella scena(vedi fig. \ref{c}).
|
||||
Per questo progetto si è utilizzata una rivisitazione dell'applicazione vista nel progetto precedente, con la differenza che l'aggiunta di un oggetto non è consentita se questo va in collisione con un altro già presente nella scena (vedi fig. \ref{c}).
|
||||
|
||||
![Schermata di errore dovuta ad una collisione](figures/c.png){#c width=225px height=400px}
|
||||
|
||||
|
@ -5,7 +5,7 @@ Anche in questo caso Sceneform non ci fornisce un supporto diretto, ma a differe
|
||||
L'`ObjectAnimator` non è una classe specifica di ARCore o Sceneform, ma dell'SDK di Android che può essere usata per gestire facilmente animazioni e transizioni all'interno delle applicazioni Android.
|
||||
Grazie a questa classe e una serie di punti nello spazio, *collegati* tramite un interpolatore, saremo in grado di conferire il movimento ai nostri modelli.
|
||||
|
||||
Per mostrare il funzionamento degli animator è stato realizzato un progetto d'esempio in grado di renderizzare un modello del sistema solare in cui i pianeti realizzano sia il modo di rotazione su se stessi, sia quello di rivoluzione intorno al sole(vedi fig. \ref{ss}).
|
||||
Per mostrare il funzionamento degli animator è stato realizzato un progetto d'esempio in grado di renderizzare un modello del sistema solare in cui i pianeti realizzano sia il modo di rotazione su se stessi, sia quello di rivoluzione intorno al sole (vedi fig. \ref{ss}).
|
||||
|
||||
![Rendering del sistema solare](figures/ss.png){#ss width=400px height=225px}
|
||||
|
||||
|
@ -163,7 +163,7 @@ private fun checkCloudAnchor(frameTime: FrameTime) {
|
||||
}
|
||||
```
|
||||
|
||||
Nel caso specifico in cui il processo di caricamento sia stato completato con successo viene eseguita la funzione `checkHosting` che si occupa di notificare all'utente il codice numerico associato all'ancora(vedi fig. \ref{ca1}) e di cambiare lo stato dell'applicazione da `HOSTING` a `HOSTED`.
|
||||
Nel caso specifico in cui il processo di caricamento sia stato completato con successo viene eseguita la funzione `checkHosting` che si occupa di notificare all'utente il codice numerico associato all'ancora (vedi fig. \ref{ca1}) e di cambiare lo stato dell'applicazione da `HOSTING` a `HOSTED`.
|
||||
|
||||
```kotlin
|
||||
private fun checkHosting() {
|
||||
@ -187,7 +187,7 @@ private fun checkHosting() {
|
||||
### Resolving dell'ancora
|
||||
|
||||
L'utente può ripristinare un'ancora premendo sul pulsante *resolve*.
|
||||
Il listener associato a questo evento è racchiuso nella funzione `onResolve` che a sua volta mostra all'utente un dialog in cui può inserire il codice dell'ancora da ripristinare(vedi fig. \ref{ca2}).
|
||||
Il listener associato a questo evento è racchiuso nella funzione `onResolve` che a sua volta mostra all'utente un dialog in cui può inserire il codice dell'ancora da ripristinare (vedi fig. \ref{ca2}).
|
||||
|
||||
```kotlin
|
||||
fun onResolveClick(view: View) {
|
||||
|
@ -44,7 +44,7 @@ Infatti per ottenere una condivisione trasparente all'utente, sono richiesti ser
|
||||
Un'altra limitazione emersa prepotentemente durante lo sviluppo è l'impossibilità di associare listener a molti eventi d'interesse.
|
||||
|
||||
Quasi tutti gli eventi più complicati del semplice tocco su una superficie piana non possono essere trattati direttamente, ma ci si deve appoggiare all'evento di aggiornamento della scena.
|
||||
Questa situazione, in *problemi non giocattolo*, comporta l'utilizzo eccessivo del listener e l'assegnazione ad esso di numerosi compiti eterogenei e quindi la nascita di un codice meno leggibile e manutenibile, con una conseguente maggiore propensione all'errore.
|
||||
Questa situazione, in problemi complessi, comporta l'utilizzo eccessivo del listener e l'assegnazione ad esso di numerosi compiti eterogenei e quindi la nascita di un codice meno leggibile e manutenibile, con una conseguente maggiore propensione all'errore.
|
||||
|
||||
## Sceneform
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user