[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