Featured image of post Come manipolare un elemento virtuale durante un'esperienza di realtà aumentata

Come manipolare un elemento virtuale durante un'esperienza di realtà aumentata

Utilizzare il touch per ridimensionare, ruotare e muovere elementi 3D in AR

Introduzione

In questo articolo ti illustrerò brevemente come poter muovere un oggetto in realtà aumentata direttamente con il touch del dispositivo.

Il progetto sarà sviluppato con Unity per dispositivi Android con le librerie ARCore e AR Foundation.

Sviluppo

Per manipolare gli oggetti dovremmo in principio creare un progetto AR dove poter utilizzare il tool AR Object Control Tool, disponibile su Github, che semplifica il ridimensionamento e la rotazione degli oggetti in AR.

Prerequisti

Prima di iniziare lo sviluppo è necessario

  • importare nel progetto le librerie ARCore e AR Foundation,
  • impostare il build per dispostivi android,
  • aggiungere ai plugin provideres ARCore,
  • rimuovere Vulkan dalle API Grafiche e impostare il build per i soli dispoistivi con Android a partire dalla versione 8,
  • ed infine potrebbe essere necessario impostare un build per i dispositivi arm64 (è necessario scriptingBackend IL2CPP).

Infine è necessario importare nel vostro progetto il package disponibile al seguente link: https://github.com/LeoSery/AR-Object-Control-Tool--Unity3DTool/releases/tag/V3.0

Configurazione della scena

  • Come per tutti i progetti AR, inzia rimuovendo la Main Camera.

  • Aggiungere alla scena XR->AR Session Origin e XR->AR Session. Dal menù GameObject > XR > aggiungi alla scena AR Session e AR Session Origin.

  • Per abilitare il plane detection aggiungi all’oggetto AR Session Origin lo script AR Plane Manager. Ti consiglio anche di modificare il campo DetectionMode to Horizontal.

  • Per interagire con funzionalità tracciabili aggiungi all’oggetto AR Session Origin lo script AR Raycast Manager.

  • Per visualizzare la posizione dei plane nella nostra scena AR abbiamo bisogno di un Plane Prefab in modo che lo script AR Plane Manager possa visualizzare la posizione del plane nella nostra scena AR; quindi aggiungiamo un XR > AR Default Plane nella scena. Trascina il nuovo oggetto creato nell’asset di progetto in modo da creare un prefab con l’AR Default Plane e cancellalo dal Hierarchy di scena.

  • Aggiungi allo script AR Plane Manager l’AR Default Plane appena creato, come da figura sottostante.

 Schermata Unity

  • A questo punto abbiamo bisogno di un oggetto da far comparire e poi manipolare sull’ambiente AR. Per fare questo creiamo un cubo e chiamiamo SpawnableObject.

Ricorda di ridurre lo scale a 0.1 per ogni asse per avere una buona visuale quando punti l’oggetto in AR.

Nel mio esempio invece del cubo utilizzero l’avatar di ReadyPlayerMe, se vuoi sapere come utilizzare l’avatar invece del cubo guarda questo articolo: https://www.francescogarofalo.it/post/come-creare-un-avatar-personalizzato-e-utilizzarlo-in-unity-con-readyplayerme/

  • Crea un tag Spawnable e aggiungetelo a SpawnableObject.

 Spawnable Object

  • Per far comparire l’oggetto Spwnable Object devi creare uno script che si occupa di questo Spawnable Manager.cs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class SpawnableManager : MonoBehaviour
{
    [SerializeField] 
    ARRaycastManager m_RaycastManager;
    List<ARRaycastHit> m_Hits = new List<ARRaycastHit>();
    [SerializeField] 
    GameObject spawnablePrefab;
    Camera arCam; 
    GameObject spawnedObject;

    void Start()
    {
        spawnedObject = null; 
        arCam = GameObject.Find("AR Camera").GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.touchCount == 0)
            return;
        RaycastHit hit;
        Ray ray = arCam.ScreenPointToRay(Input.GetTouch(0).position);

        if (m_RaycastManager.Raycast(Input.GetTouch(0).position, m_Hits))
        {
            if (Input.GetTouch(0).phase == TouchPhase.Began && spawnedObject == null)
            {
                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider.gameObject.tag == "Spawnable")
                    {
                        spawnedObject = hit.collider.gameObject;
                    }
                    else
                    {
                        SpawnPrefab(m_Hits[0].pose.position);
                    }
                }

            }
            else if (Input.GetTouch(0).phase == TouchPhase.Moved && spawnedObject != null)
            {
                spawnedObject.transform.position = m_Hits[0].pose.position;
            }
            if (Input.GetTouch(0).phase == TouchPhase.Ended)
            {
                spawnedObject = null;
            }
        }
    }

    private void SpawnPrefab(Vector3 spawnPosition)
    {
        spawnedObject = Instantiate(spawnablePrefab, spawnPosition, Quaternion.identity);
    }

}
  • Crea un oggetto di gioco vuoto nella tua scena e chiamalo SpawnManager.

  • Inserisci all’interno dell’oggetto SpawnManger lo script Spawn Manager creato in precedenza.

  • Aggiungi nel campo dello script Spawn Manager.cs Raycast Manager: AR Session Origin e nel campo Spawnable Prefab:Spawnable Object.

 Spawn Manager

A questo puoi provare che lo SpawnableObject venga correttamente istanziato.

Manipolare l’oggetto SpawnableObject

Con il package AR Object Control Tool puoi facilmente modificare in runtime alcune caratteristiche dello SpawnableObject creato nei precedenti step di questo articolo.

Configurazione

Per abilitare le attività di

  • Scaling
  • Rotating
  • Replacement
  • Movement

puoi aggiungere all’oggetto Spawnable Object lo script Movement Manager.cs.

Abilitando le opzioni Scaling, Rotating e Replacing puoi facilmente manipolare l’oggetto in AR.

Movement Manager Script

Conclusione

Aggiungendo lo script MovementManger all’oggetto che vogliamo manipolare possiamo facilmente modificare a runtime un oggetto in realtà aumentata cambiandogli posizione, dimensione e ruotandolo a nostro piacimento.

In questo modo possiamo creare facilemente qualsiasi tipo di gioco in realtà aumentata da provare in ambienti non controllati.

Fonti

Grazie :)

Condividi:
Licensed under CC BY-NC-SA 4.0
Aggiornato il Oct 15, 2023 19:00 +0200
Views
Create with Hugo, Theme Stack;
Sito creato e gestito da Francesco Garofalo;