整体思路


  1. 在VR模块的基础上调整视差,使其随距离发生变化;
  2. 左右分屏时,需要将左右屏的横向进行1/2压缩;这是因为3D-TV在对左右格式影像进行合并时,会进行拉伸;
  3. 左屏幕的相机相对于原来的(右屏)相机位置发生了变化,所以需要重新判断左屏幕相机视野内的切片,并重新进行渲染(解决黑色切片问题)。

代码部分


  1. 视差调整以及分屏横向压缩      
      function updateAndExecuteCommands(scene, passState, backgroundColor) {    
       ......
   var near = camera.frustum.near;
   var fo = near * 5.0;
   var eyeSeparation = fo / 30.0;    //var eyeTranslation = Cartesian3.multiplyByScalar(savedCamera.right, eyeSeparation * 0.5, scratchEyeTranslation);
   //修改,使得视差随相机高度变化
   //var modifyEyeSeparation = eyeSeparation * 0.5 * savedCamera.position.z ;
  //savedCamera.getMagnitude()获取距离中心的距离
   var modifyEyeSeparation = eyeSeparation * 0.5 * savedCamera.getMagnitude() ;
   var eyeTranslation = Cartesian3.multiplyByScalar(savedCamera.right, modifyEyeSeparation, scratchEyeTranslation);    viewport.x = passState.viewport.width;    // camera.frustum.aspectRatio = viewport.width / viewport.height;
   // 修改,使得VR模式下球体横向收缩
   camera.frustum.aspectRatio = viewport.width*2 / viewport.height;    var offset = 0.5 * eyeSeparation * near / fo;    //Cartesian3.add(savedCamera.position, eyeTranslation, camera.position);
   camera.frustum.xOffset = offset;
      executeCommands(scene, passState);             

           viewport.x = 0;
   //
   Cartesian3.subtract(savedCamera.position, eyeTranslation, camera.position);    camera.frustum.xOffset = -offset;
   //相机位置发生变化,所以要渲染的切片发生变化;所以重新计算需要渲染的切片,进行渲染 (这部分还需要进行完善)
   executeCommands(scene, passState);
   Camera.clone(savedCamera, camera);

2.对左屏(相机偏移的场景)重新进行渲染(暂时解决方案,对相机外的场景同样进行渲染,存在的问题:效率太低)

  CullingVolume.prototype.computeVisibility = function(boundingVolume) {
   if (!defined(boundingVolume)) {
   throw new DeveloperError('boundingVolume is required.');
   }    var planes = this.planes;
   var intersecting = true;
   for (var k = 0, len = planes.length; k < len; ++k) {
   var result = boundingVolume.intersectPlane(Plane.fromCartesian4(planes[k], scratchPlane));
   if (result === Intersect.OUTSIDE) {
   // return Intersect.OUTSIDE;
   //修改,不进行判断是否在范围内,全部进行渲染,从而避免立体视觉部分出现黑框
   return Intersect.INSIDE;
   } else if (result === Intersect.INTERSECTING) {
   intersecting = true;
   }
   }
   return intersecting ? Intersect.INTERSECTING : Intersect.INSIDE;
  };

有待解决的问题

  相机偏移后(左屏),应当对场景(左屏)重新进行渲染。具体指

    1. 重新判断boundingVolume(球体)与CullingVolume(相机的视野)的相互关系(INSIDE或OUTSIDE),即判断球体是否在相机的视野范围内,对范围内的部分进行渲染;
    2. 重新对场景进行渲染,从而将当前相机视野内的切片渲染出来,避免黑框的出现

最新文章

  1. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
  2. Java抛出OutOfMemoryError:Java heap space堆内存溢出错误的分析方案
  3. openwrt的环境搭建、定制和编译
  4. 【Python】下拉框元素的找法
  5. Timer中schedule()的用法
  6. PHP-关于$_SERVER
  7. 二维树状数组——SuperBrother打鼹鼠(Vijos1512)
  8. Sqlserver中Over函数
  9. js计算日期相减天数
  10. 每天学点SpringCloud(十四):Zipkin使用SpringCloud Stream以及Elasticsearch
  11. Eclipse支持文件UTF-8编码
  12. C++ GetSystemDirectory()
  13. 查看和修改 mysql库、表、字段编码
  14. win10输入法五笔设置
  15. 《C++数据结构-快速拾遗》 手写链表
  16. style标签下的CSS代码的显示与实时编辑
  17. python--Websocket实现, 加密 sha1,base64
  18. 字符串日期转化以及yyyy-MM-dd HH:mm:ss大小写解释
  19. Tomcat------如何打开配置界面
  20. 慕课网价值149《前端JavaScript面试技巧》笔记大公开——适应群体(学生或应届毕业生)

热门文章

  1. Unobtrusive Javascript有三层含义
  2. Jodd发送邮件
  3. 洛谷P3959 宝藏(状压dp)
  4. 笔记-JavaWeb学习之旅15
  5. VRTK3.3.0-002获取手柄事件
  6. 理解JavaScript中的深拷贝和浅拷贝
  7. Eclipse Photon 小技巧(tips)
  8. JQuery扩展和事件
  9. phpcms9.6 注入分析
  10. 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)