简体中文 | English

        在进行本文的操作前,请确认《5003ZH M系列Java API集成指南(sdkDemo)》的操作已经全部掌握,确保开发环境是正确的。

DpSdkApi.class

        这是PlatformSDK的JNI封装类,关于其中的函数,请阅读《5005ZH M系列Java API参考文档》。

DpVrView.class

        虽然该类继承了SurfaceView,事实上可以将它看做是GLSurfaceView。它的行为和GLSurfaceView是一致的。所以需要将应用中的GLSurfaceView替换为DpVrView。

        之所以重新实现了“GLSurfaceView”,是因为GLSurfaceView缺少对应用Pause和Resume的响应。所以在DpVrView中有onPause和onResume函数。同时,在MainActivity中记得调用DpVrView的onPause和onResume。

DpnMatrix4.java

        这是一个辅助类,用于生成ViewMatrix和ProjectMatrix。这里需要注意DpnnDeviceInfo提供了Resolution,IPD和FOV的参数,而ViewMatrix和ProjectMatrix的参数需要根据这些参数生成,否则可能会产生异常的画面。

流程图

        下面是整个应用的生命周期。

1.初始化

        正如GLSurfaceView的用法一样,初始化时MainActivity.onCreate时需要new DpVrView,并在DpVrView的构造函数中设置Renderer。

        然后调用sdkDpnnInit,完成初始化的工作。

2a. 普通VR应用渲染循环

        在onDrawFrame中,首先调用sdkDpnnGetPose和sdkDpnnGetPosition函数,获取用户观察的Pose和Position。用这两个参数来设置Camera的矩阵,即View Matrix。

        然后调用sdkDpnnUpdatePose,只要将前面的Pose和Position传入即可。

        然后将左右眼看到的场景分别渲染到两张纹理中,并通过sdkDpnnSetTexture函数将纹理传送给底层。

        完成一帧的渲染后,调用sdkDpnnCompose函数来提交,通知底层,已经完成渲染工作。

2b. 远程云台实时视频应用渲染循环

        注意:这里指的是带云台摄像机实时拍摄视频应用,如果是全景相机、不带云台相机、在线视频、离线视频等应用,请仍然按照2a的流程工作。

        首先调用sdkDpnnGetPose和sdkDpnnGetPosition函数,获取用户观察的Pose和Position。然后将这两个参数传到云台,让云台移动和旋转到这个Pose和Position。

        接着是需要拿到拍摄双眼照片时,云台的Pose,Position和照片。注意这里的Pose和Position不一定是前面sdkDpnnGetPose和sdkDpnnGetPosition函数获得的参数。由于云台的机械物理特性,需要以传感器测量得到云台的Pose和Position为准。

        然后调用sdkDpnnUpdate和sdkDpnnSetTexture函数,将双眼照片,随同云台的Pose和Position参数一同传到底层。

        最后调用sdkDpnnCompose函数来提交,通知底层,已经完成传输工作。

3.退出

        在Application的onTerminate中调用sdkDpnnDeinit函数。它会清理所有占用的VR资源。

关于sdkDpnnRecordPose和sdkDpnnUpdatePose

        sdkDpnnUpdatePose和sdkDpnnRecordPose函数都用于将Pose和Position信息与双眼的Texture(sdkDpnnSetTexture)对应。其中sdkDpnnRecordPose函数已经废弃,尽管调用它仍能能正常工作,但推荐使用sdkDpnnUpdatePose。

        调用sdkDpnnUpdatePose时,需要将pose和position两个参数传入。它们来自于前面调用的sdkDpnnGetPose和sdkDpnnGetPosition函数。请注意,Pose和Position必须与双眼的Texture对应。就是说,渲染双眼的Texture时用的是什么Pose和Position,那么调用sdkDpnnSetTexture前的sdkDpnnUpdatePose的Pose和Position也是什么。这个问题在普通的VR应用中并不会体现,但是在远程视频应用中尤为重要,因为远程传输的视频存在延迟和丢包。获得左右眼视频图像时(sdkDpnnSetTexture),还要传入拍摄双眼图像时云台的Pose和Position(sdkDpnnUpdatePose),否则就会由于延迟导致用户的不适感。

关于sdkDpnnPause和sdkDpnnResume

        一般来说这两个函数不需要手工调用,只要在MainActivity的onPause和onResume中调用DpVrView中的onPause和onResume即可。这两个函数用于控制底层的VR渲染。

关于多线程

        DpSdkApi.sdkDpnnInit函数被调用之前,DpVrView.Render.onDrawFrame函数不会被调用,这是多线程安全的,所以可以放心大胆地将DpSdkApi.sdkDpnnInit放到任何一个线程中。但要注意只有DpSdkApi.sdkDpnnInit被调用之后,DpVrView.Render.onDrawFrame才会运行。一般推荐将DpSdkApi.sdkDpnnInit放在MainActivity.onCreate中完成。此外,new DpVrView和DpSdkApi.sdkDpnnInit的调用次序是任意的,线程安全的。

        由于DpVrView是一个“GLSurfaceView”,所以需要注意所有的DpSdkApi函数(sdkDpnnInit和sdkDpnnDeinit除外)应该都在onDrawFrame的线程中完成。所有的OpenGL函数调用也在这个线程中完成。

Copyright © 2015deepoon.com,All Rights Reserved 沪ICP备15019466号-1 上海乐相科技有限公司