[Bf-blender-cvs] [4bd686c] multiview: Pivot for built-in (as know as basic) stereo camera
Dalai Felinto
noreply at git.blender.org
Wed May 28 03:27:35 CEST 2014
Commit: 4bd686cc959871982d8a1c36132c5978ecacf817
Author: Dalai Felinto
Date: Tue May 27 18:48:58 2014 -0300
https://developer.blender.org/rB4bd686cc959871982d8a1c36132c5978ecacf817
Pivot for built-in (as know as basic) stereo camera
That includes a fix for Toe-In which wasn't 100% correct.
===================================================================
M release/scripts/startup/bl_ui/properties_data_camera.py
M source/blender/blenkernel/intern/camera.c
M source/blender/makesdna/DNA_camera_types.h
M source/blender/makesrna/intern/rna_camera.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index fbffe98..80ba2b0 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -150,6 +150,11 @@ class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel):
row = col.row()
row.prop(st, "convergence_mode", expand=True)
+ col.separator()
+ col.label(text="Pivot:")
+ row = col.row()
+ row.prop(st, "pivot", expand=True)
+
class DATA_PT_camera(CameraButtonsPanel, Panel):
bl_label = "Camera"
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 2e00039..3ac3480 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -606,48 +606,61 @@ void BKE_camera_multiview_basic(Object *camera, const bool left)
{
Camera *data = (Camera *)camera->data;
float *r_shift = &data->shiftx;
- float interocular_distance, convergence_distance, angle;
- short convergence_mode;
+ float interocular_distance, convergence_distance;
+ float angle = 0.0f;
+ short convergence_mode, pivot;
float tmpmat[4][4];
- float distance;
float rotmat[3][3] = MAT3_UNITY;
+ float fac = 1.0f;
interocular_distance = data->stereo.interocular_distance;
convergence_distance = data->stereo.convergence_distance;
convergence_mode = data->stereo.convergence_mode;
+ pivot = data->stereo.pivot;
+
+ if (((pivot == CAM_S3D_PIVOT_LEFT) && left) ||
+ ((pivot == CAM_S3D_PIVOT_RIGHT) && !left))
+ return;
+
+ if (pivot == CAM_S3D_PIVOT_CENTER)
+ fac = 0.5f;
/* rotation */
if (convergence_mode == CAM_S3D_TOE) {
- angle = -atan((interocular_distance * 0.5f) / convergence_distance);
+ angle = -atanf((interocular_distance * 0.5f) / convergence_distance);
if (left)
angle = -angle;
- rotmat[0][0] = cos(angle);
- rotmat[2][0] = -sin(angle);
- rotmat[0][2] = sin(angle);
- rotmat[2][2] = cos(angle);
+ rotmat[0][0] = cosf(angle * 2.0f * fac);
+ rotmat[2][0] =-sinf(angle * 2.0f * fac);
+ rotmat[0][2] = sinf(angle * 2.0f * fac);
+ rotmat[2][2] = cosf(angle * 2.0f * fac);
}
copy_m4_m4(tmpmat, camera->obmat);
mul_m4_m4m3(camera->obmat, tmpmat, rotmat);
/* translation */
- if (left)
- distance = -interocular_distance * 0.5f;
- else
- distance = interocular_distance * 0.5f;
-
- translate_m4(camera->obmat, distance, 0.0f, 0.0f);
+ if (left) {
+ translate_m4(camera->obmat,
+ -interocular_distance * cosf(angle) * fac, 0.0f,
+ interocular_distance * sinf(angle) * fac);
+ }
+ else {
+ translate_m4(camera->obmat,
+ interocular_distance * cosf(angle) * fac, 0.0f,
+ -interocular_distance * sinf(angle) * fac);
+ }
/* prepare the camera shift for the projection matrix */
/* Note: in viewport, parallel renders as offaxis, but in render it does parallel */
if (convergence_mode == CAM_S3D_OFFAXIS) {
if (left)
- *r_shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * 0.5f;
+ *r_shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * fac;
else
- *r_shift -= ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * 0.5f;
+ *r_shift -= ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * fac;
}
}
@@ -655,38 +668,52 @@ void BKE_camera_stereo_matrices(Object *camera, float r_viewmat[4][4], float *r_
{
/* viewmat = MODELVIEW_MATRIX */
Camera *data = (Camera *)camera->data;
- float interocular_distance, convergence_distance, angle;
- short convergence_mode;
+ float interocular_distance, convergence_distance;
+ float angle = 0.0f;
+ short convergence_mode, pivot;
float tmpviewmat[4][4];
float transmat[4][4] = MAT4_UNITY;
+ float fac = 1.0f;
interocular_distance = data->stereo.interocular_distance;
convergence_distance = data->stereo.convergence_distance;
convergence_mode = data->stereo.convergence_mode;
+ pivot = data->stereo.pivot;
invert_m4_m4(tmpviewmat, camera->obmat);
+ if (((pivot == CAM_S3D_PIVOT_LEFT) && left) ||
+ ((pivot == CAM_S3D_PIVOT_RIGHT) && !left)) {
+ copy_m4_m4(r_viewmat, tmpviewmat);
+ return;
+ }
+
+ if (pivot == CAM_S3D_PIVOT_CENTER)
+ fac = 0.5f;
+
/* rotation */
if (convergence_mode == CAM_S3D_TOE) {
- angle = atan((interocular_distance * 0.5f) / convergence_distance);
+ angle = atanf((interocular_distance * 0.5f) / convergence_distance);
if (left)
angle = -angle;
- transmat[0][0] = cos(angle);
- transmat[2][0] = -sin(angle);
- transmat[0][2] = sin(angle);
- transmat[2][2] = cos(angle);
+ transmat[0][0] = cosf(angle * 2.0f * fac);
+ transmat[2][0] =-sinf(angle * 2.0f * fac);
+ transmat[0][2] = sinf(angle * 2.0f * fac);
+ transmat[2][2] = cosf(angle * 2.0f * fac);
}
/* translation */
if (left) {
- transmat[3][0] = interocular_distance * 0.5f;
+ transmat[3][0] = cosf(angle) * interocular_distance * fac;
+ transmat[3][2] = sinf(angle) * interocular_distance * fac;
}
else {
- transmat[3][0] = interocular_distance * -0.5f;
+ transmat[3][0] = -cosf(angle) * interocular_distance * fac;
+ transmat[3][2] = -sinf(angle) * interocular_distance * fac;
}
-
+
/* apply */
mul_m4_m4m4(r_viewmat, transmat, tmpviewmat);
@@ -694,9 +721,9 @@ void BKE_camera_stereo_matrices(Object *camera, float r_viewmat[4][4], float *r_
/* Note: in viewport, parallel renders as offaxis, but in render it does parallel */
if (ELEM(convergence_mode, CAM_S3D_OFFAXIS, CAM_S3D_PARALLEL)) {
if (left)
- *r_shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * 0.5f;
+ *r_shift += (interocular_distance / data->sensor_x) * (data->lens / convergence_distance) * fac;
else
- *r_shift -= ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * 0.5f;
+ *r_shift -= (interocular_distance / data->sensor_x) * (data->lens / convergence_distance) * fac;
}
}
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index eb44f2e..ad6881b 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -47,10 +47,11 @@ struct Ipo;
/* ------------------------------------------- */
/* Stereo Settings */
typedef struct CameraStereoSettings {
- float interocular_distance;
- float convergence_distance;
- short convergence_mode;
- short pad, pad2, pad3;
+ float interocular_distance;
+ float convergence_distance;
+ short convergence_mode;
+ short pivot;
+ short pad, pad2;
} CameraStereoSettings;
typedef struct Camera {
@@ -138,6 +139,13 @@ enum {
#define CAM_S3D_PARALLEL 1
#define CAM_S3D_TOE 2
+/* stereo->pivot */
+enum {
+ CAM_S3D_PIVOT_LEFT = 0,
+ CAM_S3D_PIVOT_RIGHT = 1,
+ CAM_S3D_PIVOT_CENTER = 2,
+};
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index ba3d1fa..eaca623 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -101,6 +101,12 @@ static void rna_def_camera_stereo_data(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
+ static EnumPropertyItem pivot_items[] = {
+ {CAM_S3D_PIVOT_LEFT, "LEFT", 0, "Left", ""},
+ {CAM_S3D_PIVOT_RIGHT, "RIGHT", 0, "Right", ""},
+ {CAM_S3D_PIVOT_CENTER, "CENTER", 0, "Center", ""},
+ };
+
srna = RNA_def_struct(brna, "CameraStereoData", NULL);
RNA_def_struct_sdna(srna, "CameraStereoSettings");
RNA_def_struct_nested(brna, srna, "Camera");
@@ -111,6 +117,11 @@ static void rna_def_camera_stereo_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mode", "");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+ prop = RNA_def_property(srna, "pivot", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, pivot_items);
+ RNA_def_property_ui_text(prop, "Pivot", "");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
prop = RNA_def_property(srna, "interocular_distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_range(prop, 0.0f, 1.f, 1, 2);
More information about the Bf-blender-cvs
mailing list