整體思路 代碼部分 2.對左屏(相機偏移的場景)重新進行渲染(暫時解決方案,對相機外的場景同樣進行渲染,存在的問題:效率太低) 有待解決的問題 相機偏移後(左屏),應當對場景(左屏)重新進行渲染。具體指 ...
整體思路
- 在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),即判斷球體是否在相機的視野範圍內,對範圍內的部分進行渲染;
- 重新對場景進行渲染,從而將當前相機視野內的切片渲染出來,避免黑框的出現