整體思路
- 在VR模塊的基礎上調整視差,使其隨距離發生變化;
- 左右分屏時,需要將左右屏的橫向進行1/2壓縮;這是因為3D-TV在對左右格式影像進行合並時,會進行拉伸;
- 左屏幕的相機相對於原來的(右屏)相機位置發生了變化,所以需要重新判斷左屏幕相機視野內的切片,並重新進行渲染(解決黑色切片問題)。
代碼部分
- 視差調整以及分屏橫向壓縮
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; };
有待解決的問題
相機偏移后(左屏),應當對場景(左屏)重新進行渲染。具體指
-
- 重新判斷boundingVolume(球體)與CullingVolume(相機的視野)的相互關系(INSIDE或OUTSIDE),即判斷球體是否在相機的視野范圍內,對范圍內的部分進行渲染;
- 重新對場景進行渲染,從而將當前相機視野內的切片渲染出來,避免黑框的出現