Creare realtà aumentata con Vuforia Object Target e Unity

 

 

In questo articolo ti spiego come creare realtà aumentata usando una qualunque bottiglietta di acqua, trasformandola in una spada laser e spostare con essa un oggetto virtuale. Lo farò sfruttando Vuforia 3d Object Scanner, Vuforia Object Target e ovviamente Unity3D. Potrebbe esserti utile per creare un game, no?

A cosa serve far uscire un raggio laser da una bottiglia? Molto probabilmente a nulla, però è interessante vedere come si può aumentare, virtualmente, la realtà di un oggetto fisico che è ben diverso dal solito foglietto di carta su cui è stampata una immagine. Bene, è ora di iniziare, come sempre mettiti comodo alla tua scrivania e soprattutto reperisci una bella bottiglietta di plastica.

 

Creare Realtà Aumentata: scansionare un oggetto fisico con Vuforia 3d Object scanner

Come nel precedente articolo, non ti spiego come installare Unity nè come configurare Vuforia, considero scontato questo passaggio, quindi inizio con il primo step fondamentale ossia la scansione della bottiglia poiché dobbiamo fare in modo che Vuforia conosca la forma dell’oggetto fisico.

Vuforia mette a disposizione, per questo scopo, una app per Android chiamata Vuforia 3d Object Scanner che puoi scaricare da questa pagina previa autenticazione.

Nel folder di installazione dell’app trovi anche l’immagine di riferimento da stampare su un foglio A4; su questo foglio, nel riquadro apposito, posiziona la bottiglia che hai scelto cosi come ho fatto nella Figura 1:

 

bottiglia vuforia object scanner fig.1
Fig.1

 

Ora avvia l’app e premi l’icona “+” in alto, inquadra il foglio con la bottiglia e appena vedi comparire i riferimenti in A R puoi avviare la scansione con il tasto REC rosso.

Da questo momento inquadra spostando la camera lentamente intorno alla bottiglia, vedrai comparire una sagoma 3D trasparente e man mano che l’app effettua una porzione di scansione, quest’ultima comparirà in verde riempiendo una parte della sagoma.

Quando l’intera sagoma diventa verde significa che l’oggetto fisico è stato totalmente scansionato, quindi puoi premere nuovamente il tasto REC, dare un nome alla scansione ed esportarla sul tuo computer perchè ti servirà nel prossimo step.

 

Creare Realtà Aumentata: aggiungere un Vuforia Object Target

Il file ottenuto ha una estensione “.od”, apri il sito web di Vuforia, entra nel tuo account e crea un nuovo database chiamandolo come preferisci; aggiungi un nuovo target, scegli 3D Object come tipologia e associa il file della scansione come in Fig.2: a r

 

Scheda Vuforia realtà aumentata Fig.2
Fig.2

 

e aggiungi come un normale ImageTarget anche una qualsiasi immagine a cui in seguito associerai l’oggetto 3D da spostare con la bottiglia “laser”, quindi il tuo database conterrà due target, vedi Fig. 3:

 

Scheda inserimento marker realtà aumentata Fig.3
Fig.3

 

Per questo progetto ho utilizzato Unity 2018.1.8f1 ma puoi scegliere qualsiasi build della serie 2018, semplicemente perchè trovi Vuforia già incluso e da attivare.

Esporta quindi il database e importalo in Unity3D, poi aggiungi il gameobject ARCamera dal menu di Vuforia, una istanza di tipo ImageTarget e una di tipo ObjectTarget (che trovi sotto Vuforia | 3D Scan nel menu GameObject di Unity3D).

Seleziona ARCamera dalla finestra Hierarchy, clicca sul pulsante “Open Vuforia Configuration” e imposta a 3 o 4 il numero massimo di oggetti e immagini che Vuforia deve agganciare simultaneamente, come in figura seguente: a r

 

Scheda max simultaneos objects Fig.4
Fig.4

 

Ora seleziona il gameobject di tipo ImageTarget che hai in precedenza aggiunto in Hierarchy, crea una istanza di un cubo o una sfera, posizionandolo come child dell’ImageTarget; seleziona l’istanza del gameobject che contiene il 3D e aggiungi il componente BoxCollider (se hai creato un cubo) impostandone IsTrigger = False.

Crea un Tag, chiamalo “ObjectA” e associalo a questo gameobject, servirà al codice che troverai alla fine dell’articolo per capire se il collider intercettato appartiene proprio al tuo cubo.

Aggiungere la Realtà Aumentata

Benissimo, ora passiamo al gameobject più importante per il tuo progetto.

Seleziona l’ObjectTarget in Hierarchy, clicca su Advanced di ObjectTarget Behaviour in Inspector e imposta a 1 Lenght, Width e Height e spunta la casella di Show Bounding Box.

Spero sia sottinteso per te che devi aver selezionato il tuo database e l’ObjectTarget negli appositi campi prima di Advanced, come in Fig.5:

 

Scheda vuforia object target Fig.5
Fig.5

 

Bene, cosi facendo hai creato una istanza di Vuforia Object Target in Unity e il bounding box che vedi rappresenta la tua bottiglietta, quindi ora puoi aggiungere il raggio laser sistemandolo dove preferisci rispetto alla bottiglia.

 

Unity realtà aumentata spada laser Fig.6
Fig.6

 

Ho utilizzato Volumetric Lines dall’Asset Store di Unity3D e ho aggiunto uno dei suoi prefab come child di Vuforia Object Target posizionandolo accanto alla bottiglia aiutandomi con il Bounding Box.

Ma la cosa fondamentale è aggiungere un componente CapsuleCollider ad esso (con IsTrigger a True)  e un RigidBody con Use Gravity = False e Is Kinematic = True e infine…

 

Ovviamente il codice per la Realtà Aumentata

altrimenti come fai a spiegare ad una bottiglia “laser” che deve spostare un oggetto virtuale nello spazio?

Quindi crea uno script, chiamalo “ColliderManager” e incolla al suo interno il codice seguente:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColliderManager : MonoBehaviour
{
   private GameObject obj;
   private bool connected = false;
   void Start ()
   {
      obj = GameObject.FindGameObjectWithTag("ObjectA") ;
   }
   void OnTriggerEnter(Collider other)
   {
      if (other.tag == "ObjectA")
      {
         connected = true;
      }
   }
   void OnTriggerExit(Collider other)
   {
      if (other.tag == "ObjectA")
      {
         connected = false;
      }
   }
   void Update()
   {
      if (connected == true)
      {
         Vector3 pos = obj.transform.position;
         pos = Vector3.Lerp(obj.transform.position, transform.position, Time.deltaTime * 30);
         obj.transform.position = pos;
      }
   }
}

associa questo script al gameobject del laser.

Nel metodo Start() viene valorizzata la  variabile private obj con l’istanza del cubo, puoi notare l’utilizzo di GameObject.FindGameObjectWithTag(“ObjectA”) poichè ho preferito l’utilizzo dei tag per brevità.

Nell’evento OnTriggerEnter() viene eseguito un test per verificare quale collider è stato intercettato e impostare a True la variabile connected che utilizzo per capire quando il laser colpisce il cubo.

L’evento OnTriggerExit(), a sua volta, viene attivato quando il laser cessa di toccare il collider del cubo e imposta a False la variabile connected.

Nell’evento Update(), se il cubo è correntemente toccato dal laser (connected = True), muovo il cubo secondo la posizione in cui sposto il laser.

 

Conclusioni

Perfetto, ti annuncio che sei arrivato alla conclusione di questo tutorial su come creare realtà aumentata per spostare oggetti virtuali, se non hai una telecamera supportata da Vuforia devi fare una build per iOS o Android e testarla sullo smartphone. Se vedi il risultato che ti ho mostrato nel video, all’inizio dell’articolo, significa che hai raggiunto l’obiettivo.

Ho scritto per te un lungo tutorial per realizzare con A R, Unity Vuforia il portale interdimensionale ARKit, leggilo. Se non l’hai ancora fatto, leggi anche questo tutorial sulle collisioni in augmented reality, ti darà qualche idea per i tuoi progetti più importanti e sarà propedeutico per comprendere meglio quello che hai letto.

Se invece vuoi leggere quali sono secondo me alcuni tra i migliori asset disponibili nello Unity Asset Store allora puoi dare una occhiata a questo articolo. Grazie per la tua attenzione.

 

🔥2.5 K volte è stato letto questo articolo
Se ti è piaciuto questo articolo, lascia le tue stelle!

2 Comments

  • Nitin

    25 Agosto 2020 - 10:28

    I have tried according to your tutorial but mine is not working. I’m unable to move the objects with ray????

  • Fabio Carucci

    25 Agosto 2020 - 10:54

    Hello Nitin,

    Do you have exceptions in debug?
    Do you set correctly the colliders?
    Do you added the tag “ObjectA” to the gameobject above in the tutorial?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *