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!