Camera_VideoCamera¶
演示如何使用Camera功能。
演示如何打开/关闭camera
演示如何切换camera
演示如何获取camera图像贴图
演示如何控制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前设置 VideoCameraDeviceCameraOpenMethod 、 VideoCameraDeviceCameraIndex 或 VideoCameraDeviceCameraType 。
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;
}