1. 程式人生 > >在CesiumVR基礎上實現3D左右立體視覺

在CesiumVR基礎上實現3D左右立體視覺

for function eight erro 格式 comment fse 代碼 問題:

整體思路


  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. 重新對場景進行渲染,從而將當前相機視野內的切片渲染出來,避免黑框的出現

在CesiumVR基礎上實現3D左右立體視覺