我刚刚开始修补 Tango 和 Unity。不幸的是,似乎没有任何文档或示例说明如何使用最新版本在 Unity 中访问颜色数据。
我一直使用来自 GitHub ( https://github.com/googlesamples/tango-examples-unity ) 的运动跟踪示例作为起点,尝试以与读取姿势和深度数据相同的方式读取传入的颜色帧。我假设最好的方法是通过“ITangoVideoOverlay”接口和“OnTangoImageAvailableEventHandler”回调。
我现在要做的就是让“OnTangoImageAvailableEventHandler”回调工作,但我无法弄清楚。我在 Tango 管理器上选中了“启用视频叠加”,并将以下脚本连接到 GUI 文本对象以进行调试。
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;
}
}
是否有一些我缺少的相机初始化?或者仍然是在这个旧代码中使用 VideoOverlayListener 的首选方法:Getting color data in Unity
我知道也可以通过 Unity 直接访问相机(禁用深度)。但我想先学习“正确的方式”。
感谢您的时间!
2015 年 4 月 28 日更新 - 脚本的最新版本,回调有效!仍然需要转换为 RGB 颜色
该脚本是作为 GitHub 上 Google Tango Motion Tracking 示例的补充而编写的。将脚本附加到 Unity 摄像机,然后将公共字段“m_viewScreen”链接到网格对象(如平面)以显示视频纹理。
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!
}
}