Index: intern/cycles/blender/blender_camera.cpp =================================================================== --- intern/cycles/blender/blender_camera.cpp (revision 42820) +++ intern/cycles/blender/blender_camera.cpp (working copy) @@ -274,8 +274,14 @@ bcam.farclip *= 0.5; bcam.nearclip = -bcam.farclip; + float sensor_size; + if(bcam.sensor_fit == BlenderCamera::VERTICAL) + sensor_size = bcam.sensor_height; + else + sensor_size = bcam.sensor_width; + bcam.ortho = true; - bcam.ortho_scale = b_rv3d.view_distance(); + bcam.ortho_scale = b_rv3d.view_distance() * sensor_size / b_v3d.lens(); } bcam.zoom *= 2.0f; Index: source/blender/blenkernel/intern/camera.c =================================================================== --- source/blender/blenkernel/intern/camera.c (revision 42820) +++ source/blender/blenkernel/intern/camera.c (working copy) @@ -262,11 +262,12 @@ } else if(rv3d->persp==RV3D_ORTHO) { /* orthographic view */ + int sensor_size = camera_sensor_size(params->sensor_fit, params->sensor_x, params->sensor_y); params->clipend *= 0.5f; // otherwise too extreme low zbuffer quality params->clipsta= - params->clipend; params->is_ortho= TRUE; - params->ortho_scale = rv3d->dist; + params->ortho_scale = rv3d->dist * sensor_size / v3d->lens; params->zoom= 2.0f; } else { Index: source/blender/editors/include/ED_view3d.h =================================================================== --- source/blender/editors/include/ED_view3d.h (revision 42820) +++ source/blender/editors/include/ED_view3d.h (working copy) @@ -300,4 +300,6 @@ void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic); void ED_view3D_background_image_clear(struct View3D *v3d); +float ED_view3d_distance(const float mat[4][4], const float ofs[3]); + #endif /* ED_VIEW3D_H */ Index: source/blender/editors/space_view3d/view3d_view.c =================================================================== --- source/blender/editors/space_view3d/view3d_view.c (revision 42820) +++ source/blender/editors/space_view3d/view3d_view.c (working copy) @@ -156,6 +156,7 @@ if(lens) sms.new_lens= *lens; if (camera) { + sms.new_dist = ED_view3d_distance(camera->obmat, ofs); ED_view3d_from_object(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens); sms.to_camera= 1; /* restore view3d values in end */ } @@ -180,7 +181,7 @@ /* original values */ if (oldcamera) { - sms.orig_dist= rv3d->dist; // below function does weird stuff with it... + sms.orig_dist = ED_view3d_distance(oldcamera->obmat, rv3d->ofs); ED_view3d_from_object(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens); } else { Index: source/blender/editors/space_view3d/view3d_edit.c =================================================================== --- source/blender/editors/space_view3d/view3d_edit.c (revision 42820) +++ source/blender/editors/space_view3d/view3d_edit.c (working copy) @@ -92,6 +92,7 @@ void ED_view3d_camera_lock_init(View3D *v3d, RegionView3D *rv3d) { if(ED_view3d_camera_lock_check(v3d, rv3d)) { + rv3d->dist = ED_view3d_distance(v3d->camera->obmat, rv3d->ofs); ED_view3d_from_object(v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL); } } @@ -874,6 +875,7 @@ /* changed since 2.4x, use the camera view */ if(vod->v3d->camera) { + rv3d->dist = ED_view3d_distance(vod->v3d->camera->obmat, rv3d->ofs); ED_view3d_from_object(vod->v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL); } @@ -3464,6 +3466,16 @@ return (*depth==FLT_MAX) ? 0:1; } +float ED_view3d_distance(const float mat[4][4], const float ofs[3]) { + float pos[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + float dir[4] = {0.0f, 0.0f, 1.0f, 0.0f}; + mul_m4_v4(mat, pos); + add_v3_v3(pos, ofs); + mul_m4_v4(mat, dir); + normalize_v3(dir); + return dot_v3v3(pos, dir); +} + /* Gets the view trasnformation from a camera * currently dosnt take camzoom into account *