Camera_VideoCamera

演示如何使用Camera功能。

  • 演示如何打开/关闭camera

  • 演示如何切换camera

  • 演示如何获取camera图像贴图

  • 演示如何控制camera显示

  • 演示如何水平翻转camera图像

用法

../../_images/image_17.png
标记1:显示系统状态和操作提示。
标记2:是否打开Camera。
标记3:是否显示Camera图像。
标记4:是否捕捉Camera图像并显示到Cube上。
标记5:是否水平镜像渲染Camera图像。
标记6:按Camera设备的索引切换Camera。

详解

开关相机

相机设备可以通过使用 VideoCameraDevice.enabled 来开关。

public void EnableCamera(bool enable)
{
    videoCamera.enabled = enable;
}

开关相机图像显示

相机图像显示可以使用 CameraImageRenderer.enabled 来开关。这个方式不会对相机设备的开关产生影响,因此在显示关闭时AR仍会工作。这在AR眼镜上显示时十分有用。

public void ShowCameraImage(bool show)
{
    cameraRenderer.enabled = show;
}

获取相机图像纹理

使用 CameraImageRenderer.RequestTargetTexture 来注册获取纹理的handler,并使用 CameraImageRenderer.DropTargetTexture 在使用后释放资源。

public void Capture(bool on)
{
    if (on)
    {
        cameraRenderer.RequestTargetTexture(targetTextureEventHandler);
    }
    else
    {
        cameraRenderer.DropTargetTexture(targetTextureEventHandler);
    }
}

在handler中可以直接使用纹理。

Action<Camera, RenderTexture> targetTextureEventHandler = (camera, texture) =>
{
    if (texture)
    {
        CubeRenderer.material.mainTexture = texture;
    }
    else
    {
        ...
    }
};

Unity在使用插件创建的RenderTexture时无法隐藏不同平台的不同,因此在渲染管线中使用这个纹理时,你需要正确处理不同渲染API下 render texture坐标的不同

样例中的代码显示了渲染API如何影响这个纹理,请注意在使用Metal的时候纹理做了翻转,以确保显示保持一致。这只是消除不同的一种方法,通常你需要像 Unity 文档 中建议的那样在shader中处理。

if (SystemInfo.graphicsDeviceType == UnityEngine.Rendering.GraphicsDeviceType.Metal)
{
    CubeRenderer.transform.localScale = new Vector3(-1, -(float)Screen.height / Screen.width, 1);
}
else
{
    CubeRenderer.transform.localScale = new Vector3(1, (float)Screen.height / Screen.width, 1);
}

这个样例中使用camera图像做显示,因此它直接使用了 texture。如果你需要在CPU而不是GPU中访问图像数据,最好在 ARSession.FrameChange 的事件处理中使用 OutputFrame.inputFrame().image().buffer() 获取字节数组并对不同图像类型进行处理,这样可以得到最佳的性能,避免不必要的处理。

切换相机

在打开camera前设置 VideoCameraDeviceCameraOpenMethodVideoCameraDeviceCameraIndexVideoCameraDeviceCameraType

videoCamera.CameraOpenMethod = VideoCameraDevice.CameraDeviceOpenMethod.DeviceIndex;
videoCamera.CameraIndex = index;
videoCamera.Close();
videoCamera.Open();

水平翻转相机图像

翻转通常可以用在需要镜像显示的时候。使用 ARSession.HorizontalFlipNormal 以及 ARSession.HorizontalFlipFront 来实现。前置相机图像默认会被翻转。

if (isFront)
{
    arSession.HorizontalFlipFront = flip ? ARSession.ARHorizontalFlipMode.World : ARSession.ARHorizontalFlipMode.None;
}
else
{
    arSession.HorizontalFlipNormal = flip ? ARSession.ARHorizontalFlipMode.World : ARSession.ARHorizontalFlipMode.None;
}