这一节将分析API的具体功能及代码调用。
OpenVR 从1.0.0版本起,在OpenVR.cs中包含了CVRTrackedCamera这个类,然而最新版的SteamVR插件(V1.1.0)中尚不包含该类。
在OpenVR最新版本(1.0.2)版本中已包含12个函数,简单的介绍下作用:
GetCameraErrorNameFromEnum:获取错误类型转换成文本名称。
HasCamera:是否有外置相机;
GetCameraFrameSize:获取相机帧缓存大小;
GetCameraIntrinisics:看返回结果是相机的focallength焦距和center中心;
GetCameraProjection:获取相机投影矩阵,znear,zfar;
AcquireVideoStreamingService:申请获取视频流;
ReleaseVideoStreamingService:释放申请;
GetVideoStreamFrameBuffer:获取视频流帧缓存;
GetVideoStreamTextureSize:获取视频流图像尺寸;
GetVideoStreamTextureD3D11:获取D3D11视频流图像;
GetVideoStreamTextureGL:获取GL视频流图像;
ReleaseVideoStreamTextureGL:释放D3D11视频流图像;
自带的实例中用到的只包括以下几个,按程序执行顺序:
HasCamera和GetCameraErrorNameFromEnum。在CQTrackedCameraOpenVRTest::InitOpenVR()函数中;
GetCameraFrameSize和AcquireVideoStreamingService。在CQTrackedCameraOpenVRTest::StartVideoPreview();
GetVideoStreamFrameBuffer。在CQTrackedCameraOpenVRTest::OnDisplayRefreshTimeout();
最后调用CQCameraPreviewImage::SetFrameImage( )将视频流画出来。基本上用这几个函数就可以调用摄像头的图像了。
另外API中有图像类型的枚举变量:
public enumEVRTrackedCameraFrameType
{
Distorted = 0,
Undistorted = 1,
MaximumUndistorted = 2,
MAX_CAMERA_FRAME_TYPES = 3,
}
各参数获取的图像如下:第一张是Distorted的正常画面,第三章的右上角分辨率是1224x920,但图像扭曲的很厉害,而且边缘也不太清晰。看代码的注释,是说其包含了Invalid的部分图像(将不太清晰部分裁掉了?)不太明白为什么相机拍出来的会有不可用部分,求大神解答!
PS1: 在Unity的商店中有Valve公司The Lab 游戏的源码分享,The Lab Renderer。还不知道的赶紧下载学习下吧!之所以提这个是因为里面有24个Vive前置摄像头视频处理的函数,比开源的OpenVR中还多,这算不算泄露了内部版本?!有兴趣的赶紧研究研究啊。
PS2: 如何在Unity中利用API调用摄像头还没攻关,之前有用过WebCamera这个Unity的API去获取图像并作为texture放到场景中。利用OpenVR的API应该是在获取FrameBuffer后,将其保存为texture再放入场景就行。等弄出来以后我会再share具体的工程!