Index: intern/cycles/blender/blender_camera.cpp =================================================================== --- intern/cycles/blender/blender_camera.cpp (revision 48187) +++ intern/cycles/blender/blender_camera.cpp (working copy) @@ -408,8 +408,14 @@ bcam->farclip *= 0.5f; 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->type = CAMERA_ORTHOGRAPHIC; - 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 48187) +++ source/blender/blenkernel/intern/camera.c (working copy) @@ -262,11 +262,12 @@ } else if (rv3d->persp == RV3D_ORTHO) { /* orthographic view */ + int sensor_size= BKE_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 48187) +++ source/blender/editors/include/ED_view3d.h (working copy) @@ -310,6 +310,7 @@ 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], const float ofs[3]); float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit); /* view matrix properties utilities */ Index: source/blender/editors/space_view3d/view3d_view.c =================================================================== --- source/blender/editors/space_view3d/view3d_view.c (revision 48187) +++ source/blender/editors/space_view3d/view3d_view.c (working copy) @@ -160,6 +160,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 */ } @@ -184,7 +185,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 48187) +++ source/blender/editors/space_view3d/view3d_edit.c (working copy) @@ -96,6 +96,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); } } @@ -895,6 +896,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); } @@ -3693,6 +3695,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 transformation from a camera * currently dosnt take camzoom into account