Puntos claves y herramientas para crear tu primera aplicación de realidad aumentada

La realidad aumentada (AR) es una tecnología emergente que combina elementos virtuales con el mundo real para crear experiencias interactivas y enriquecedoras. Con la popularidad creciente de dispositivos móviles y el aumento de la potencia de procesamiento, crear tu primera aplicación de AR ya no es solo para desarrolladores experimentados. En este ensayo, discutiremos los puntos clave y las herramientas necesarias para crear tu primera aplicación de AR.

Antes de comenzar a desarrollar tu aplicación, es importante tener una idea clara de lo que quieres lograr.

¿Qué problema estás tratando de resolver o qué experiencia estás tratando de crear? ¿Qué tipo de contenido quieres mostrar y cómo quieres que los usuarios interactúen con él? Responder estas preguntas ayudará a determinar qué tecnologías y herramientas necesitarás y cómo deberá ser tu aplicación.

Una vez que tengas una idea clara de tu aplicación, es importante elegir la plataforma adecuada. Actualmente, las principales plataformas de AR son iOS y Android, aunque también hay opciones para PC y consolas de juegos. Es importante elegir una plataforma en la que tengas experiencia o con la que te sientas cómodo, ya que cada una tiene sus propios requisitos de desarrollo y herramientas.

Una vez que hayas elegido tu plataforma, es importante elegir un motor de juegos o un marco de desarrollo de AR. Estos motores y marcos te proporcionarán las herramientas y los recursos necesarios para crear tu aplicación, incluidos los modelos 3D, las animaciones y las funciones de detección de imágenes. Algunos de los motores de juegos y marcos de desarrollo de RA más populares son Unity, Unreal Engine y Vuforia.

Una vez que hayas elegido tu motor de juegos o marco de desarrollo, es importante tener en cuenta la detección de imágenes. La detección de imágenes es esencial para superponer contenido virtual en el mundo real, y hay varios tipos disponibles, como la detección de marcas, la detección de patrones y la detección de rostros. Es importante elegir el tipo de detección de imágenes adecuado para tu aplicación y asegurarte de que tu motor de juegos o marco de desarrollo lo admita.

Finalmente, es importante tener en cuenta el diseño y la experiencia de usuario de tu aplicación. El diseño y la experiencia de usuario son fundamentales para la aceptación y el éxito de tu aplicación. Es importante asegurarte de que tu aplicación sea fácil de usar, intuitiva y atractiva visualmente. Además, es importante asegurarte de que tu aplicación se adapte a las necesidades y preferencias de tus usuarios, y de que proporcione una experiencia satisfactoria.

Para lograr esto, es importante investigar sobre las tendencias y las mejores prácticas en diseño y experiencia de usuario en el campo de la AR.

Esto incluye investigar sobre cómo los usuarios interactúan con las aplicaciones de AR, qué tipo de contenido funciona mejor y cómo se puede mejorar la experiencia del usuario. Además, es importante realizar pruebas y recibir retroalimentación de los usuarios para asegurarte de que tu aplicación está cumpliendo con sus expectativas.

Puntos claves y herramientas para crear tu primera aplicación de realidad aumentada
Puntos claves y herramientas para crear tu primera aplicación de realidad aumentada

En resumen, crear tu primera aplicación de AR es un desafiante proyecto que requiere de una planificación cuidadosa y de la selección de las herramientas adecuadas. Es importante tener una idea clara de lo que quieres lograr con tu aplicación, elegir la plataforma adecuada, elegir un motor de juegos o marco de desarrollo, tener en cuenta la detección de imágenes y prestar atención al diseño y la experiencia de usuario. Con estas herramientas y estos conocimientos, estarás en buen camino para crear tu primera aplicación de AR exitosa.

Algunas preguntas interesantes que podrían surgir a partir del tema de crear tu primera aplicación de realidad aumentada incluyen:

¿Qué son los motores de juegos y los marcos de desarrollo de AR y cuáles son algunos de los más populares?

Un motor de juegos es un software que se utiliza para desarrollar juegos y aplicaciones interactivas. Los marcos de desarrollo de AR son conjuntos de herramientas y recursos que se utilizan para desarrollar aplicaciones de AR. Algunos de los motores de juegos y marcos de desarrollo de AR más populares son Unity, Unreal Engine y Vuforia.

¿Qué tipos de detección de imágenes existen y cuál es el adecuado para mi aplicación?

Existen varios tipos de detección de imágenes, como la detección de marcas, la detección de patrones y la detección de rostros. La detección de marcas utiliza una imagen o un patrón específico para detectar un objeto, mientras que la detección de patrones utiliza un conjunto de puntos característicos para detectar un objeto. La detección de rostros utiliza la tecnología de reconocimiento facial para detectar y rastrear rostros. El tipo adecuado dependerá del tipo de contenido que deseas mostrar y cómo deseas que los usuarios interactúen con él.

¿Qué factores debo tener en cuenta al diseñar mi aplicación de AR?

Al diseñar tu aplicación de AR, debes tener en cuenta factores como la facilidad de uso, la intuitividad, la atractividad visual y la adaptación a las necesidades y preferencias de tus usuarios. Además, es importante investigar sobre las tendencias y las mejores prácticas en diseño y experiencia de usuario en el campo de la AR, realizar pruebas y recibir retroalimentación de los usuarios para asegurarte de que tu aplicación está cumpliendo con sus expectativas.

¿Qué herramientas específicas necesito para desarrollar mi aplicación de AR?

Para desarrollar tu aplicación de AR, necesitarás una variedad de herramientas, dependiendo de la plataforma y el motor de juegos o marco de desarrollo que elijas. Esto podría incluir un software de diseño 3D para crear modelos y animaciones, un software de edición de vídeo para crear contenido multimedia, un software de programación para escribir el código de tu aplicación, y un software de pruebas para probar y depurar tu aplicación. También podrías necesitar herramientas adicionales para la detección de imágenes y la integración de la realidad aumentada en tu aplicación.

¿Qué dificultades podría enfrentar al desarrollar mi primera aplicación de AR?

Desarrollar tu primera aplicación de AR puede presentar varias dificultades, como aprender a usar nuevas herramientas y tecnologías, superar desafíos técnicos, y asegurarte de que tu aplicación cumpla con las expectativas de los usuarios. También puedes enfrentar problemas con la detección de imágenes, la superposición de contenido virtual en el mundo real y la optimización de la experiencia del usuario. Sin embargo, estos desafíos son comunes en cualquier proyecto de desarrollo de software y pueden superarse con una planificación cuidadosa, un enfoque metódico y la ayuda de recursos y comunidades en línea.

¿Qué ventajas tiene la realidad aumentada en comparación con la realidad virtual?

La realidad aumentada (AR) y la realidad virtual (RV) son tecnologías similares pero con algunas diferencias importantes. La AR utiliza elementos virtuales para enriquecer la experiencia del mundo real, mientras que la RV crea un mundo completamente virtual en el que el usuario está inmerso. La AR tiene la ventaja de ser más fácil de acceder, ya que se puede utilizar con dispositivos móviles y no requiere un equipo especializado. Además, la AR puede ser más eficaz para tareas que requieren una conexión con el mundo real, como la capacitación, la reparación de maquinaria, y la navegación.

¿Qué aplicaciones tienen la realidad aumentada actualmente?

Actualmente, la realidad aumentada se utiliza en una variedad de campos y aplicaciones, como el entretenimiento, la educación, la publicidad, la medicina, la arquitectura, la fabricación y la ingeniería. Por ejemplo, en entretenimiento, se utiliza para juegos y experiencias de realidad aumentada; en educación, para la visualización de contenido educativo, y en la industria, para la capacitación y la reparación de maquinaria. Además, la AR también se está utilizando en aplicaciones de negocios, como el marketing y las ventas, para mejorar la interacción con los clientes y aumentar la eficacia de las campañas publicitarias.

¿Cómo puedo monetizar mi aplicación de realidad aumentada?

Existen varias formas de monetizar tu aplicación de realidad aumentada, dependiendo del tipo de aplicación y de tu audiencia. Algunas opciones comunes incluyen:

  • Publicidad: mostrando anuncios en tu aplicación y cobrando a las empresas por su exposición.
  • Comercio electrónico: vender productos o servicios a través de tu aplicación.
  • Suscripciones: ofrecer contenido exclusivo o características adicionales a los usuarios que pagan una suscripción.
  • In-App Purchases: ofrecer compras dentro de la aplicación como nuevos niveles o contenido adicional.
  • Licencias: vender licencias de tu aplicación a otras empresas o individuos para su uso comercial.

Es importante tener en cuenta que cada opción tiene sus propios desafíos y requisitos, por lo que es importante investigar y considerar cuál es la mejor opción para tu aplicación y tu audiencia.

En conclusión, la realidad aumentada es una tecnología emergente con un gran potencial y una amplia variedad de aplicaciones. Crear tu primera aplicación de AR requiere de una planificación cuidadosa y la selección de las herramientas adecuadas. Es importante tener una idea clara de lo que quieres lograr con tu aplicación, elegir la plataforma adecuada, elegir un motor de juegos o marco de desarrollo, tener en cuenta la detección de imágenes y prestar atención al diseño y la experiencia de usuario. Con estas herramientas y estos conocimientos, estarás en buen camino para crear una aplicación de AR exitosa.

Realidad virtual y los reencuentros terapéuticos

¿Cuánto alivio o consuelo puede brindar la tecnología? Es una pregunta que trasciende lo técnico y se adentra en la relación entre el mundo virtual y el real. Una experiencia muy llamativa la expuso el documental Encontrándote, emitido por la televisora surcoreana MBC.

Para esa producción se recreó la imagen de Na-yeon, una niña de siete años que murió por una enfermedad sanguínea. Esto permitió a su madre, Jang Ji-sung, tener un encuentro con ella a través de la realidad virtual.

Con sus lentes de RV la señora interactuó con una “versión digital” de su hija en 3D creada durante ocho meses de trabajo y que contó con el apoyo de un actor para recrear movimiento.

“La gente a menudo piensa que la tecnología es algo frío. Decidimos participar para ver si la tecnología puede consolar el corazón cuando se usa para las personas ”, dijo Lee Hyun-suk, director de VIVE Studios, con sede en Seúl, quien estuvo al frente del proyecto.

Si bien la realidad virtual tiene grandes aplicaciones en el mundo del entretenimiento, tocar las fibras más sensibles de las personas, como en el caso de Na-yeon, ha levantado cierta polémica, a pesar de contar con el aval de expertos en salud mental.

Muchos se cuestionan hasta qué punto esta “realidad ficticia” puede anclar a las personas impidiéndole superar el duelo. No obstante, dos expertos surcoreanos hablaron bien de este tipo de experiencias, como terapia psicológica.

«Es muy útil para las personas que han sufrido una pérdida inesperada para tener una despedida en condiciones tras un dolor profundo», dijo a la BBC, Seon-Gyu Koh, del Instituto Universitario de Salud Mental de Corea del Sur.

Mientras, Dong-Gwi Lee, de la Universidad de Yonsei, asegura que tanto la realidad virtual como la aumentada ya se han usado en el tratamiento de trastornos de ansiedad, fobias, demencia y depresión.

La novedosa estrategia de recrear a una persona fallecida para que interactúe con sus parientes vivos tiene sus límites y costos, aunque la producción surcoreana no reveló cuánto fue en esta ocasión, se requiere mucha capacidad de cómputo y equipos especializados para crear una versión realista.

En cuanto a los límites, las personas solo pueden ver a quien se recrea, no es posible generar efectos en los otros sentidos, por los momentos.

La ciencia ficción sí ha explorado otros caminos. La serie Black Mirror tiene al menos dos capítulos futuristas que se acercan a lo visto en el documental surcoreano. Se trata del episodio 1 de la segunda temporada y del 4 de la tercera.

En el primero un clon sustituye al difunto esposo de una mujer afligida por la repentina muerte de su esposo. El sujeto se comporta como el marido gracias a que su conciencia está cargada en su memoria. En el segundo caso, se trata de un programa que permite a las personas vivir la eternidad deseada gracias a mantenerlas “despiertas” después de la muerte.

¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!

ZoeGeop Technologies
MarketPlace

Crea tu cuenta

Suscríbete

[latest-selected-content output=»slider» limit=»4″ date_limit=»1″ date_start=»2″ date_start_type=»months» image=»medium» css=»four-columns tall as-overlay light» type=»post» status=»publish» taxonomy=»category» orderby=»dateD» show_extra=»category» slidermode=»fade» slideslides=»1″ slidescroll=»1″ sliderinfinite=»true» slidercontrols=»true» sliderauto=»true» sliderspeed=»3000″ chrlimit=»120″ url=»yes»]

 

Suscríbete a nuestro canal de YouTube

Síguenos en nuestro canal de YouTube dedicado a tecnología, marketplace de proyectos tecnológicos, cursos online y tutoriales de desarrollo de videojuegos. Ofrecemos consultoría en desarrollo de software, marketing online, servicios de TI, hosting web, dominios web y más.

 

Siguenos en Patreon

Si quieres contribuir con cualquier aporte o donación hacia nuestros proyectos y el canal puedes hacerlo a través de nuestra cuenta en Patreon.

 

Únete a nuestro Discord

 

Síguenos en Twitter

 

Facebook

 

Instagram

 

Linkedin

 

Pinterest

Una combinación de alto impacto

Noviembre de 1995 será recordado en la historia del cine como el mes en que inició una nueva era en la forma de hacer películas. Fue en ese mes cuando se estrenó Toy Story, el primer largometraje animado creado enteramente por computadora.

La película fue obra del estudio Pixar y distribuida gracias a un acuerdo con Disney. La empresa, propiedad de Steve Jobs desde 1986, tenía años desarrollando la tecnología que permitía crear objetos con aspecto 3D en computadora.

Se trata del software RenderMan que actualmente se usa tanto para películas como en videojuegos y está disponible para uso no comercial. En 1995 y 2001, la compañía recibió el Oscar de la Academia por este aporte a la cinematografía.

Este avance dio pie a otras innovaciones que han permitido cada vez cintas más realistas. Si ponemos un poco de atención, nos daremos cuenta que al menos en las primeras cinco películas de Pixar, las personas no son el centro de la historia. Esto se puede explicar por la dificultad que para la época significaba reproducir en 3D los gestos, especialmente los del rostro.

Allí es donde irrumpe Shrek, que si bien no es un humano, sí centra la historia en personajes de carne y hueso. Esta cinta de DreamWorks SKG se trabajó  por primera vez con simulación de personajes para darle mayor realismo al cabello, pelaje, texturas de telas, fuego, agua e iluminación global. Lo que fue mejorando con cada una de las secuelas, como ocurrió con Pixar en sus siguientes producciones.

Todo este desarrollo tecnológico se apoya también en el aumento de la velocidad de procesamiento y de almacenamiento. Por ejemplo, la película Cómo entrenar a tu dragón 2 (Dream Works), requiere hasta 10.000 núcleos informáticos simultáneos y 250 TB de espacio en disco activo para almacenar la película y entregarla a los servidores.

Por otro lado, hablando de películas no animadas, tenemos el uso de CGI (Computer Generated Imagery, en inglés) que no es otra cosa que imágenes generadas por computadora lo que hace que la ficción se acerque más a la realidad y podamos ver a personajes como Iron Man, Thanos o los habitantes de Pandora en Avatar.

En eso fueron pioneras las cintas Total Recal (1990) y Parque Jurásico (1993). Esta última asombró a la audiencia con enormes animales prehistóricos de todo tipo interactuando con los humanos del film.

Uno de los usos de esta forma de crear imágenes es la de “volver a la vida” a los actores. A través de un sistema de inteligencia artificial se procesan fotos y videos de la persona con las que un software desarrolla un patrón que imita sus gestos y voz. Se utilizó para que Philip Seymour Hoffman apareciera en Los juegos del hambre; Paul Walker en Rápidos y furiosos 7 y Carrie Fisher (la princesa Leia) en Star Wars.

¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!

ZoeGeop Technologies
MarketPlace

Crea tu cuenta

Suscríbete

La revolucionaria tecnología de holograma 7D cambia nuestra realidad

Los fanáticos de Star Wars recordarán con nostalgia aquella escena cuando R2D2 reproduce el holograma de la princesa Leia pidiendo ayuda a Obi-Wan Kenobi y que desencadena la historia que atrae a millones de seguidores. Pues ese tipo de imágenes ya no están solo en las películas y son posibles gracias a la tecnología de holograma 7D.

¿Por qué se llama así? Explicado de forma sencilla podemos decir que un holograma 7D es como tener un montón de fotógrafos que rodean a un sujeto. En 3D, se describe la posición de cada fotógrafo. En 2D, se describe el ángulo desde el que cada fotógrafo apunta su  cámara. Cada cámara registra propiedades de luz y tiempo. Entonces los parámetros resultantes son: posición 3D + ángulo 2D + propiedades de luz + tiempo = 7D.

A diferencia de la fotografía y los videos, un holograma no es una imagen emitida sobre una superficie plana, que muestra cierta profundidad en una dirección al sobresalir de la pantalla. Es una proyección que da la sensación de que el objeto o persona está presente y que se puede ejecutar incluso en tiempo real.

La historia de esta tecnología se remonta a 1947, cuando el físico Dennis Gabor desarrolló la teoría de la holografía, por lo cual se le galardonó con el Nobel de Física en 1971. Sin embargo, fueron Emmett Leith y Juris Upatnieks, en 1962, quienes produjeron el primer holograma: un tren de juguete.

Si bien ya hemos visto algunos ejemplos de los usos en el área de entretenimiento de los hologramas 7D (como el dragón de Daenerys en un estadio o las exhibiciones en Dubái), queda mucho por desarrollar para que se masifique.

No obstante, eso no impide que ya se proyecte la forma en que esta tecnología va a revolucionar nuestro mundo actual.  Por ejemplo, en la medicina será una herramienta para visualizar datos de pacientes mientras se capacita a estudiantes y cirujanos.

Otro campo que es sensible a cambios gracias a los hologramas 7D es el educación. Cuando esta tecnología sea asequible, los estudiantes podrán asistir a una conferencia en su sala de estar y al mismo tiempo “estarán” en su salón de clases.

Un área donde ya se está implementando (gracias a los enormes presupuestos que manejan) es la militar. Una compañía estadounidense entregó más de 13.000 mapas holográficos en 3D de «espacios de batalla» para el ejército de ese país. De esta manera, los soldados se entrenan en un terreno tridimensional, muy cercano a la realidad.

¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!

ZoeGeop Technologies
MarketPlace

Crea tu cuenta

Suscríbete

La realidada aumentada (AR, por sus siglas en inglés) abre una posibilidad de negocios en donde hay espacio tanto para grandes empresas como para el emprendimiento. Esta tecnología que permite al usuario visualizar parte del mundo real a través de un dispositivo en la forma de información gráfica, se desarrolla a pasos agigantados y entre junio de 2018 y junio de 2019 captó inversiones por 5.400 millones de dólares, según la consultora de Digi Capitals.

Es un mercado en crecimiento y sus perspectivas son prometedoras. Las estimaciones apuntan a que tendrá un volumen de negocios superior a los 160.000 millones de dólares en los próximos cinco años.

Carlos López, CEO y cofundador de una incubadora y escuela especializada en tecnologías inmersivas, comentó al sitio https://www.emprendedores.es que “los sectores que presentan mayores oportunidades son los de la educación, simulación, comunicación y colaboración, arquitectura, ingeniería, medicina, militar e industria».

Así que hay espacio para el emprendimiento. Creatividad e innovación son dos de los ejes conductores que te llevan a concretar un emprendimiento, que como cualquier otro, necesitará de innovación y creatividad para crear un producto con valor agregado.

Empecemos con los videojuegos, hasta ahora el contenido más rentable en cuanto a realidad aumentada. Seguro ya pensaste en Pokemon Go, la app que generó ingresos por $1.200 millones. Efectivamente Nintendo puso la vara bastante alta, pero hay espacio para mucho más.

Desarrollar un juego con AR es una forma de incursionar en este mercado. En ZoeGeop puedes consultar tutoriales para hacerlos y luego publicar tu proyecto para venderlo o conseguir financiamiento.

Otra forma de emprender con la realidad aumentada es desarrollando aplicaciones utilitarias. Que le den al usuario una herramienta para tomar decisiones, aprender algo nuevo o ver más allá de lo que tiene ante sus ojos. Un ejemplo, son las app para comparar precios  o características de productos, reparar algún tipo de aparato o encontrar los mejores lugares para comer en la ciudad.

El nivel de conocimiento que se requiere para desarrollar emprendimientos con realidad aumentada depende de lo específico que quieras crear. Hay empresas dedicadas a detalles como texturas o que mezclan esta tecnología con realidad virtual para requerimientos de otras empresas.

¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!

ZoeGeop Technologies
MarketPlace

Crea tu cuenta

Suscríbete

Crea un juego de realidad aumentada en Unity3D con Vuforia al estilo Pokemon Go
¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!

Suscríbete

Suscríbete a nuestro canal de YouTube

Síguenos en nuestro canal de YouTube dedicado a tecnología, marketplace de proyectos tecnológicos, cursos online y tutoriales de desarrollo de videojuegos. Ofrecemos consultoría en desarrollo de software, marketing online, servicios de TI, hosting web, dominios web y más.

Siguenos en Patreon

Si quieres contribuir con cualquier aporte o donación hacia nuestros proyectos y el canal puedes hacerlo a través de nuestra cuenta en Patreon.

Realizar portales dimensionales en realidad aumentada ya es una realidad. En esta oportunidad te presentamos una muestra del potencial y alcance que puede implementar el motor de realidad aumentada ARCore en Unity.

Asset Implementados:

https://assetstore.unity.com/packages…

https://assetstore.unity.com/packages…

https://assetstore.unity.com/packages…

Links de referencia:

https://unity3d.com/es

https://developers.google.com/ar/

https://developers.google.com/ar/deve…l

Clase ARController:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;

#if UNITY_EDITOR
//using input = GoogleARCore.InstantPreviewInput;
#endif
public class ARController : MonoBehaviour
{
    //Listamos la lista de planos que ARCore detecta en el frame actual
    private List m_newDetectedPlanes = new List();
    public GameObject GridPrefab;
    public GameObject Portal;
    public GameObject ARCamera;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Screen.sleepTimeout = SleepTimeout.NeverSleep;
        //Verifica ARCore session status
        if(Session.Status != SessionStatus.Tracking)
        {
            return;
        }

        //La siguiente funcion llenará m_newDetectedPlanes con los planos que ARCore detecte en el frame actual
        Session.GetTrackables(m_newDetectedPlanes, TrackableQueryFilter.New);

        //Instanciamos un Grid por cada DetectedPlane en m_newDetectedPlanes
        for(int i=0; i < m_newDetectedPlanes.Count; i++)
        {
            GameObject grid = Instantiate(GridPrefab, Vector3.zero, Quaternion.identity, transform);
            //Ésta función seteará la posición del Grid y modificará los vertices del mesh adjunto
            grid.GetComponent().Initialize(m_newDetectedPlanes[i]);
        }

        //Verifica si el usuario ha tocado la pantalla
        Touch touch;
        if(Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
        {
            return;
        }

        //Verificamos is el usuario tocó algun plano detectado
        TrackableHit hit;
        if(Frame.Raycast(touch.position.x,touch.position.y, TrackableHitFlags.PlaneWithinPolygon, out hit))
        {
            //Ahora ubicamos el portal arriba de los planos detectados cuando los tocamos

            //Habilitamos el portal
            Portal.SetActive(true);

            //Creamos una nueva ancla
            Anchor anchor = hit.Trackable.CreateAnchor(hit.Pose);

            //Seteamos la posición del portal a la misma de la posición de toque
            Portal.transform.position = hit.Pose.position;
            Portal.transform.rotation = hit.Pose.rotation;

            //Ubicamos el portal enfrente de la camara
            Vector3 cameraPosition = ARCamera.transform.position;

            //El portal sólo rotará en el eje Y
            cameraPosition.y = hit.Pose.position.y;

            //Rotamos el portal enfrente de la camara
            Portal.transform.LookAt(cameraPosition, Portal.transform.up);

            //ARCore se mantendrá analizando el entorno del mundo real y actualizando las anclas mientras necesitemos añadir nuestro portal a las anclas
            Portal.transform.parent = anchor.transform;
        }
    }
}

Clase GridVisualizer:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
public class GridVisualizer : MonoBehaviour
{
    private static int s_PlaneCount = 0;
    private readonly Color[] k_PlaneColors = new Color[]
    {
        new Color(1.0f, 1.0f, 1.0f),
        new Color(0.956f, 0.262f, 0.211f),
        new Color(0.913f, 0.117f, 0.388f),
        new Color(0.611f, 0.152f, 0.654f),
        new Color(0.403f, 0.227f, 0.717f),
        new Color(0.247f, 0.317f, 0.709f),
        new Color(0.129f, 0.588f, 0.952f),
        new Color(0.011f, 0.662f, 0.956f),
        new Color(0f, 0.737f, 0.831f),
        new Color(0f, 0.588f, 0.533f),
        new Color(0.298f, 0.686f, 0.313f),
        new Color(0.545f, 0.764f, 0.290f),
        new Color(0.803f, 0.862f, 0.223f),
        new Color(1.0f, 0.921f, 0.231f),
        new Color(1.0f, 0.756f, 0.027f)
    };

    private DetectedPlane m_DetectedPlane;

    // Keep previous frame's mesh polygon to avoid mesh update every frame.
    private List m_PreviousFrameMeshVertices = new List();
    private List m_MeshVertices = new List();
    private Vector3 m_PlaneCenter = new Vector3();

    private List m_MeshColors = new List();

    private List m_MeshIndices = new List();

    private Mesh m_Mesh;

    private MeshRenderer m_MeshRenderer;

    ///
    /// The Unity Awake() method.
    /// 
    public void Awake()
    {
        m_Mesh = GetComponent().mesh;
        m_MeshRenderer = GetComponent();
    }

    ///
    /// The Unity Update() method.
    /// 
    public void Update()
    {
        if (m_DetectedPlane == null)
        {
            return;
        }
        else if (m_DetectedPlane.SubsumedBy != null)
        {
            Destroy(gameObject);
            return;
        }
        else if (m_DetectedPlane.TrackingState != TrackingState.Tracking)
        {
                m_MeshRenderer.enabled = false;
                return;
        }

        m_MeshRenderer.enabled = true;

        _UpdateMeshIfNeeded();
    }

    ///
    /// Initializes the DetectedPlaneVisualizer with a DetectedPlane.
    /// 
    ///The plane to vizualize.
    public void Initialize(DetectedPlane plane)
    {
        m_DetectedPlane = plane;
        m_MeshRenderer.material.SetColor("_GridColor", k_PlaneColors[s_PlaneCount++ % k_PlaneColors.Length]);
        m_MeshRenderer.material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f));

        Update();
    }

    ///
    /// Update mesh with a list of Vector3 and plane's center position.
    /// 
    private void _UpdateMeshIfNeeded()
    {
        m_DetectedPlane.GetBoundaryPolygon(m_MeshVertices);

        if (_AreVerticesListsEqual(m_PreviousFrameMeshVertices, m_MeshVertices))
        {
            return;
        }

        m_PreviousFrameMeshVertices.Clear();
        m_PreviousFrameMeshVertices.AddRange(m_MeshVertices);

        m_PlaneCenter = m_DetectedPlane.CenterPose.position;

        Vector3 planeNormal = m_DetectedPlane.CenterPose.rotation * Vector3.up;

        m_MeshRenderer.material.SetVector("_PlaneNormal", planeNormal);

        int planePolygonCount = m_MeshVertices.Count;

        // The following code converts a polygon to a mesh with two polygons, inner
        // polygon renders with 100% opacity and fade out to outter polygon with opacity 0%, as shown below.
        // The indices shown in the diagram are used in comments below.
        // _______________     0_______________1
        // |             |      |4___________5|
        // |             |      | |         | |
        // |             | =>   | |         | |
        // |             |      | |         | |
        // |             |      |7-----------6|
        // ---------------     3---------------2
        m_MeshColors.Clear();

        // Fill transparent color to vertices 0 to 3.
        for (int i = 0; i < planePolygonCount; ++i)
        {
            m_MeshColors.Add(Color.clear);
        }

        // Feather distance 0.2 meters.
        const float featherLength = 0.2f;

        // Feather scale over the distance between plane center and vertices.
        const float featherScale = 0.2f;

        // Add vertex 4 to 7.
        for (int i = 0; i < planePolygonCount; ++i)
        {
            Vector3 v = m_MeshVertices[i];

            // Vector from plane center to current point
            Vector3 d = v - m_PlaneCenter;

            float scale = 1.0f - Mathf.Min(featherLength / d.magnitude, featherScale);
            m_MeshVertices.Add((scale * d) + m_PlaneCenter);

            m_MeshColors.Add(Color.white);
        }

        m_MeshIndices.Clear();
        int firstOuterVertex = 0;
        int firstInnerVertex = planePolygonCount;

        // Generate triangle (4, 5, 6) and (4, 6, 7).
        for (int i = 0; i < planePolygonCount - 2; ++i)
        {
            m_MeshIndices.Add(firstInnerVertex);
            m_MeshIndices.Add(firstInnerVertex + i + 1);
            m_MeshIndices.Add(firstInnerVertex + i + 2);
        }

        // Generate triangle (0, 1, 4), (4, 1, 5), (5, 1, 2), (5, 2, 6), (6, 2, 3), (6, 3, 7)
        // (7, 3, 0), (7, 0, 4)
        for (int i = 0; i < planePolygonCount; ++i)
        {
            int outerVertex1 = firstOuterVertex + i;
            int outerVertex2 = firstOuterVertex + ((i + 1) % planePolygonCount);
            int innerVertex1 = firstInnerVertex + i;
            int innerVertex2 = firstInnerVertex + ((i + 1) % planePolygonCount);

            m_MeshIndices.Add(outerVertex1);
            m_MeshIndices.Add(outerVertex2);
            m_MeshIndices.Add(innerVertex1);

            m_MeshIndices.Add(innerVertex1);
            m_MeshIndices.Add(outerVertex2);
            m_MeshIndices.Add(innerVertex2);
        }

        m_Mesh.Clear();
        m_Mesh.SetVertices(m_MeshVertices);
        m_Mesh.SetTriangles(m_MeshIndices, 0);
        m_Mesh.SetColors(m_MeshColors);
    }

    private bool _AreVerticesListsEqual(List firstList, List secondList)
    {
        if (firstList.Count != secondList.Count)
        {
            return false;
        }

        for (int i = 0; i < firstList.Count; i++)
        {
            if (firstList[i] != secondList[i])
            {
                return false;
            }
        }

        return true;
    }
}

Clase PortalManager:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class PortalManager : MonoBehaviour
{
    public GameObject MainCamera;
    public GameObject Sponza;
    public GameObject Scenario;
    public GameObject Zombie;
    public GameObject SPIDER;


    private Material[] SponzaMaterials;
    private Material[] ScenarioMaterials;
    private Material[] ZombieMaterials;
    private Material[] SpiderMaterials;

    private Vector3 camPositionInPortalSpace;

    // Start is called before the first frame update
    void Start()
    {
        SponzaMaterials = Sponza.GetComponent().sharedMaterials;
        ScenarioMaterials = Scenario.GetComponent().sharedMaterials;
        ZombieMaterials = Zombie.GetComponent().sharedMaterials;
        SpiderMaterials = SPIDER.GetComponent().sharedMaterials;

    }

    // Update is called once per frame
    void OnTriggerStay(Collider collider)
    {
        Debug.Log("camPositionInPortalSpace: "+camPositionInPortalSpace.z);
        Debug.Log("MainCamera.transform.position: "+MainCamera.transform.position);

        if(MainCamera.transform.position.z < 0.5f)
        {
            //Deshabilita la plantilla de prueba
            for(int i=0; i < SponzaMaterials.Length; ++i)
            {
                SponzaMaterials[i].SetInt("_StencilComp", 0);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }

            for(int i=0; i < ScenarioMaterials.Length; ++i)
            {
                ScenarioMaterials[i].SetInt("_StencilComp", 0);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }
            for(int i=0; i < ZombieMaterials.Length; ++i)
            {
                ZombieMaterials[i].SetInt("_StencilComp", 0);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }
            for(int i=0; i < SpiderMaterials.Length; ++i)
            {
                SpiderMaterials[i].SetInt("_StencilComp", 0);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }
            
        }
        else
        {
            //Habilita la plantilla de prueba
            for(int i=0; i < SponzaMaterials.Length; ++i)
            {
                SponzaMaterials[i].SetInt("_StencilComp", 3);
            }

            for(int i=0; i < ScenarioMaterials.Length; ++i)
            {
                ScenarioMaterials[i].SetInt("_StencilComp", 3);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }
            for(int i=0; i < ZombieMaterials.Length; ++i)
            {
                ZombieMaterials[i].SetInt("_StencilComp", 3);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }
            for(int i=0; i < SpiderMaterials.Length; ++i)
            {
                SpiderMaterials[i].SetInt("_StencilComp", 3);
                Debug.Log("else camera position: "+MainCamera.transform.position.z);
            }
        } 
    }

}

SponzaShader:

// (c) 2018 Guidev
// This code is licensed under MIT license (see LICENSE.txt for details)

Shader "Unlit/SponzaShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		[Enum(CompareFunction)] _StencilComp("Stencil Comp", int) = 3
		[Enum(CompareFunction)] _StencilComp("Stencil Comp", int) = 0
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			Stencil{
				Ref 1
				Comp [_StencilComp]
				//Comp Always
			}
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float4 normal: NORMAL;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float3 normal: TEXCOORD1;
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.normal = normalize(mul(v.normal, unity_WorldToObject));
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float3 normal = normalize(i.normal);
				float3 lightDir = normalize(float3(0.0, 10.0, 10.0));
				float l = max(dot(lightDir, normal), 0.0);
				float4 texCol = tex2D(_MainTex, i.uv);
				fixed4 col = texCol * l + texCol * 0.4f;
				return col;
			}
			ENDCG
		}
	}
}

Portal Shader:

// (c) 2018 Guidev
// This code is licensed under MIT license (see LICENSE.txt for details)

Shader "Unlit/Portal"
{
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float4 normal: NORMAL;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float3 normal: TEXCOORD1;
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.normal = normalize(mul(v.normal, unity_WorldToObject));
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float3 normal = normalize(i.normal);
				float3 lightDir = normalize(float3(0.0, 10.0, 10.0));
				float l = max(dot(lightDir, normal), 0.0);
				return fixed4(l, l, l, 1.0f) + fixed4(0.3, 0.3, 0.3, 1.0);
			}
			ENDCG
		}
	}
}

PortalPlane Shader:

// (c) 2018 Guidev
// This code is licensed under MIT license (see LICENSE.txt for details)

Shader "Unlit/PortalPlane"
{
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100
		Zwrite Off
		ColorMask 0

		Pass
		{
			Stencil{
				Ref 1
				Comp always
				Pass replace
			}

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
			};

			struct v2f
			{
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				return fixed4(0.0, 0.0, 0.0, 0.0);
			}
			ENDCG
		}
	}
}

Imágenes de configuración de los objetos dentro del proyecto HelloAR.

Suscríbete a nuestro canal de YouTube

Síguenos en nuestro canal de YouTube dedicado a tecnología, marketplace de proyectos tecnológicos, cursos online y tutoriales de desarrollo de videojuegos. Ofrecemos consultoría en desarrollo de software, marketing online, servicios de TI, hosting web, dominios, web y más.

Síguenos en Patreon

Si quieres contribuir con cualquier aporte o donación hacia nuestros proyectos y el canal puedes hacerlo a través de nuestra cuenta en Patreon.

¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!

Te presentamos en esta oportunidad un breve tutorial donde mostramos cómo instalar y configurar tus proyectos en los cuales quieras implementar realidad aumentada con el Core de realidad aumentada de Google.

ARCore es una excelente opción que puedes integrar fácilmente con el motor de videojuegos Unity y diseñar videojuegos y proyectos en este ámbito muy estables y que sorprenderán a más de uno en este segmento.

Suscríbete a nuestro canal de YouTube

Síguenos en nuestro canal de YouTube dedicado a tecnología, marketplace de proyectos tecnológicos, cursos online y tutoriales de desarrollo de videojuegos. Ofrecemos consultoría en desarrollo de software, marketing online, servicios de TI, hosting web, dominios web y más.

Siguenos en Patreon

Si quieres contribuir con cualquier aporte o donación hacia nuestros proyectos y el canal puedes hacerlo a través de nuestra cuenta en Patreon.

¿Quieres publicar tus propios proyectos?. ¡Pues que esperas!