Este post pretende desvelar parte del código del app del proyecto artístico «Never Gone Forever», con el fin de que pueda ser usado libremente por desarrolladores y artistas que estén explorando las opciones que el software de realidad aumentada ofrece. En concreto vamos a desvelar cómo arrastrar objetos en realidad aumentada.
Este tutorial presupone un conocimiento básico sobre el entorno de desarrollo Unity3d y las librerías de realidad aumentada Vuforia.
Paso a explicar cómo podemos hacer que un objeto pueda ser arrastrado por el usuario al hacer click dentro del plano tridimensional de la realidad aumentada. El movimiento se realizará en el plano Z, es decir, que el script de más abajo permite al usuario arrastrar objetos en el plano perpendicular a la cámara de realidad aumentada. De esta forma, podemos arrastrar elementos por la pantalla hacia los lados, arriba y abajo, pero nunca hacia delante y hacia atrás.
Para conseguir este comportamiento en cualquier GameObject, tan sólo tenemos que crear en Unity un Script (en mi caso uso C#), en el que pegaremos el siguiente código:
using System.Collections;
using UnityEngine;
using Vuforia;
public class makeObjectDraggable : MonoBehaviour
{
private float dist;
private Vector3 v3Offset;
private Plane plane;
void OnMouseDown()
{
plane.SetNormalAndPosition(Camera.main.transform.forward, transform.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
plane.Raycast(ray, out dist);
v3Offset = transform.position - ray.GetPoint(dist);
}
void OnMouseDrag()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
plane.Raycast(ray, out dist);
Vector3 v3Pos = ray.GetPoint(dist);
transform.position = v3Pos + v3Offset;
}
}
Cómo funciona
Para arrastrar objetos en realidad aumentada, lo que hace el código es tomar la posición tridimensional del objeto y «pegarlo» a un plano bidimensional, que es como una pared vertical invisible, justo frente del usuario, a la misma distancia que el propio objecto. A continuación se toma en cuenta la posición de la cámara, y cada vez que el usuario hace click, se traza una linea recta desde ésta hasta el punto clickado en un hipotético horizonte infinito. El punto exacto en el que se produce la intersección entre la linea recta y el plano vertical es el punto en el que el objeto se encuentra. Al mover el ratón con el botón pulsado, se crean nuevas intersecciones, a las que el objeto se traslada, dando la ilusión de que sigue el movimiento fluido de un ratón o un dedo. El objeto se mueve, recordemos, por los ejes X e Y, pero no por el Z. Al dejar de pulsar el ratón o despegar el dedo de la pantalla dejan de realizarse tanto las intersecciones como el movimiento, por lo que la acción cesa de inmediato.
Una vez creado y guardado el script, añadiremos el script al GameObject, simplemente arrastrando el archivo hasta la vista del inspector. Para que el código funcione, es necesario que el GameObject tenga también un Collider asignado y activo, en mi caso un Box Collider. Esto es totalmente imrescindible porque los colliders son los objetos que son receptivos a eventos como pueden ser clicks de ratón o toque con el dedo en la pantalla del dispositivo.
Si quieres saber más sobre cómo arrastrar objetos en realidad aumentada, tienes cualquier tipo de duda, o quieres compartir otra forma de conseguir el mismo efecto, no dudes en comentar.