Patch #29142: Reduce hopping when switching between perspective and orthographic on 3D view
Patch by Yasuhiro Fujii, thanks! Original issue was that in vases viewport's lens are different from default value switching between perspective and orthographic projections will change viewplane a lot, which is disorienting and annoying.
This commit is contained in:
@@ -411,8 +411,14 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL:
|
||||
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;
|
||||
|
@@ -262,11 +262,12 @@ void BKE_camera_params_from_view3d(CameraParams *params, View3D *v3d, RegionView
|
||||
}
|
||||
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 {
|
||||
|
@@ -295,6 +295,7 @@ struct BGpic *ED_view3D_background_image_new(struct View3D *v3d);
|
||||
void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic);
|
||||
void ED_view3D_background_image_clear(struct View3D *v3d);
|
||||
|
||||
float ED_view3d_offset_distance(float mat[4][4], float ofs[3]);
|
||||
float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit);
|
||||
|
||||
/* view matrix properties utilities */
|
||||
|
@@ -96,6 +96,7 @@ int ED_view3d_camera_lock_check(View3D *v3d, RegionView3D *rv3d)
|
||||
void ED_view3d_camera_lock_init(View3D *v3d, RegionView3D *rv3d)
|
||||
{
|
||||
if (ED_view3d_camera_lock_check(v3d, rv3d)) {
|
||||
rv3d->dist = ED_view3d_offset_distance(v3d->camera->obmat, rv3d->ofs);
|
||||
ED_view3d_from_object(v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL);
|
||||
}
|
||||
}
|
||||
@@ -894,6 +895,7 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
|
||||
/* changed since 2.4x, use the camera view */
|
||||
if (vod->v3d->camera) {
|
||||
rv3d->dist = ED_view3d_offset_distance(vod->v3d->camera->obmat, rv3d->ofs);
|
||||
ED_view3d_from_object(vod->v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL);
|
||||
}
|
||||
|
||||
@@ -3924,6 +3926,18 @@ int ED_view3d_autodist_depth_seg(ARegion *ar, const int mval_sta[2], const int m
|
||||
return (*depth == FLT_MAX) ? 0 : 1;
|
||||
}
|
||||
|
||||
float ED_view3d_offset_distance(float mat[4][4], 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the view transformation from a 4x4 matrix.
|
||||
*
|
||||
|
@@ -161,6 +161,7 @@ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera
|
||||
if (lens) sms.new_lens = *lens;
|
||||
|
||||
if (camera) {
|
||||
sms.new_dist = ED_view3d_offset_distance(camera->obmat, ofs);
|
||||
ED_view3d_from_object(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens);
|
||||
sms.to_camera = TRUE; /* restore view3d values in end */
|
||||
}
|
||||
@@ -185,7 +186,7 @@ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera
|
||||
|
||||
/* original values */
|
||||
if (oldcamera) {
|
||||
sms.orig_dist = rv3d->dist; /* below function does weird stuff with it... */
|
||||
sms.orig_dist = ED_view3d_offset_distance(oldcamera->obmat, rv3d->ofs);
|
||||
ED_view3d_from_object(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens);
|
||||
}
|
||||
else {
|
||||
|
Reference in New Issue
Block a user