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


整體思路


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM