unity tag rich unity3d google-project-tango

unity3d - tag - rich text unity



Acceder a cuadros de colores con Unity y Tango ''Leibniz'' (1)

Estoy empezando a jugar con Tango y Unity. Lamentablemente, no parece haber documentación o ejemplos sobre cómo acceder a los datos de color en Unity con la última versión.

He estado usando el ejemplo de seguimiento de movimiento de GitHub ( https://github.com/googlesamples/tango-examples-unity ) como punto de partida, tratando de leer los marcos de color entrantes de la misma manera en que se leen los datos de posición y profundidad. Supongo que la mejor manera es pasar por la interfaz "ITangoVideoOverlay" y la devolución de llamada "OnTangoImageAvailableEventHandler".

Todo lo que intento hacer ahora es hacer funcionar la devolución de llamada "OnTangoImageAvailableEventHandler" y no puedo entenderlo. He activado "Habilitar superposición de video" en Tango Manager y el siguiente guión conectado a un objeto de texto GUI para la depuración.

using System.Collections; using UnityEngine; using UnityEngine.UI; using Tango; using System; public class VideoController : MonoBehaviour, ITangoVideoOverlay { private TangoApplication m_tangoApplication; private bool debugB = false; public Text debugText; // Use this for initialization void Start () { m_tangoApplication = FindObjectOfType<TangoApplication>(); m_tangoApplication.Register(this); } // Update is called once per frame void Update () { if (debugB) debugText.text = "TRUE"; else debugText.text = "FALSE"; } // No Unity API public void OnTangoImageAvailableEventHandler(Tango.TangoEnums.TangoCameraId id, Tango.TangoUnityImageData image) { debugB = true; } }

¿Hay alguna inicialización de la cámara que me falta? O es el método preferido para usar VideoOverlayListener como en este código anterior: Obtener datos de color en Unity

Sé que también es posible acceder directamente a la cámara a través de Unity (deshabilitar la profundidad). Pero me gustaría aprender la "forma correcta" primero.

¡Gracias por tu tiempo!

Actualización 04/28/15 - ¡Última versión del script, la devolución de llamada funciona! Aún necesita una conversión a color RGB

Este script se escribió como una adición al ejemplo de seguimiento de movimiento de Tango de Google en GitHub. Adjunte la secuencia de comandos a una cámara Unity y luego vincule el campo público "m_viewScreen" a un objeto de malla (como un plano) para que se muestre la textura del video.

using System.Collections; using UnityEngine; using Tango; using System; public class VideoController : MonoBehaviour { private TangoApplication m_tangoApplication; private Texture2D m_texture; private Material m_screenMaterial; private MeshFilter m_meshFilter; private bool m_readyToDraw = false; // Link to a mesh object for displaying texture public GameObject m_viewScreen; // Use this for initialization void Start () { // Tango initilization m_tangoApplication = FindObjectOfType<TangoApplication>(); m_tangoApplication.Register(this); m_tangoApplication.RegisterPermissionsCallback(_OnTangoApplicationPermissionsEvent); // Initialize view object Material m_meshFilter = m_viewScreen.GetComponent<MeshFilter> (); m_screenMaterial = new Material(Shader.Find("Mobile/Unlit (Supports Lightmap)")); // Begin to texture to webcam m_texture = m_tangoApplication.GetVideoOverlayTexture(); m_texture.Apply(); if (m_screenMaterial != null) { // Apply the texture m_screenMaterial.mainTexture = m_texture; m_meshFilter.GetComponent<MeshRenderer>().material = m_screenMaterial; // Connect the texture to the camera if (m_tangoApplication.m_useExperimentalVideoOverlay) { VideoOverlayProvider.ExperimentalConnectTexture(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, m_texture.GetNativeTextureID(), _OnUnityFrameAvailable); } else { VideoOverlayProvider.ConnectTexture(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, m_texture.GetNativeTextureID()); } } } private void _OnTangoApplicationPermissionsEvent(bool permissionsGranted) { m_readyToDraw = true; } private void _OnUnityFrameAvailable(System.IntPtr callbackContext, Tango.TangoEnums.TangoCameraId cameraId) { // Do fun stuff here! } void OnPreRender() { if (m_readyToDraw) { VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR); GL.InvalidateState(); } } void Update () { // Do other fun stuff here! } }


Por lo que pude encontrar, cambiaron todo el sistema por lo que es más fácil acceder a la imagen, donde todo el agarre de imágenes es manejado por el objeto Tango.

En su Inicio después de tomar la aplicación de Tango, intente esto:

m_texture = m_tangoApplication.GetVideoOverlayTexture(); m_texture.Apply(); if (m_screenMaterial != null) { // Apply the texture m_screenMaterial.mainTexture = m_texture; m_meshFilter.GetComponent<MeshRenderer>().material = m_screenMaterial; // Connect the texture to the camera if (m_tangoApplication.m_useExperimentalVideoOverlay) { VideoOverlayProvider.ExperimentalConnectTexture(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, m_texture.GetNativeTextureID(), _OnUnityFrameAvailable); } else { VideoOverlayProvider.ConnectTexture(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, m_texture.GetNativeTextureID()); } }

y necesitarás esto en otro lugar para el evento de devolución de llamada:

private void _OnUnityFrameAvailable(System.IntPtr callbackContext, Tango.TangoEnums.TangoCameraId cameraId) { // Do fun stuff here! }

Pero realmente no necesita hacer nada. Por supuesto, la imagen todavía está en formato YUV-NV12, por lo que deberá convertirla a RGB (o esperar hasta su próxima versión, que debería arreglarla).

Editar: ¡Ups! Olvidé que necesita una llamada más para actualizar realmente la textura en el material AR:

En Start () después de tomar TangoApp:

m_tangoApplication.RegisterPermissionsCallback(_OnTangoApplicationPermissionsEvent);

Entonces:

private void _OnTangoApplicationPermissionsEvent(bool permissionsGranted) { m_readyToDraw = true; } void OnPreRender() { if (m_readyToDraw) { VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR); GL.InvalidateState(); } }

Espero que eso funcione ahora!