[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42654] branches/soc-2011-tomato: Camera tracking: add camera to follow track and object solver constraint

Sergey Sharybin sergey.vfx at gmail.com
Thu Dec 15 21:38:33 CET 2011


Revision: 42654
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42654
Author:   nazgul
Date:     2011-12-15 20:38:23 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
Camera tracking: add camera to follow track and object solver constraint

Object used to be parented to active camera which isn't very convenient when
working with witness cameras.

Now parent camera can be specified in constraint (if it's not specified, active camera is used)

Modified Paths:
--------------
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py
    branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
    branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_constraint_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_constraint.c

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py	2011-12-15 19:32:57 UTC (rev 42653)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py	2011-12-15 20:38:23 UTC (rev 42654)
@@ -776,6 +776,8 @@
             layout.prop_search(con, "object", clip.tracking, "objects", icon='OBJECT_DATA')
             layout.prop_search(con, "track", clip.tracking, "tracks", icon='ANIMATION_DATA')
 
+        layout.prop(con, "camera")
+
         layout.operator("clip.constraint_to_fcurve")
 
     def CAMERA_SOLVER(self, context, layout, con):
@@ -798,6 +800,8 @@
         if clip:
             layout.prop_search(con, "object", clip.tracking, "objects", icon='OBJECT_DATA')
 
+        layout.prop(con, "camera")
+
         row = layout.row()
         row.operator("constraint.objectsolver_set_inverse")
         row.operator("constraint.objectsolver_clear_inverse")

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c	2011-12-15 19:32:57 UTC (rev 42653)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c	2011-12-15 20:38:23 UTC (rev 42654)
@@ -3937,6 +3937,7 @@
 	bFollowTrackConstraint *data= con->data;
 	
 	func(con, (ID**)&data->clip, userdata);
+	func(con, (ID**)&data->camera, userdata);
 }
 
 static void followtrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
@@ -3947,11 +3948,12 @@
 	MovieTracking *tracking;
 	MovieTrackingTrack *track;
 	MovieTrackingObject *tracking_object;
+	Object *camob= data->camera ? data->camera : scene->camera;
 
 	if (data->flag & FOLLOWTRACK_ACTIVECLIP)
 		clip= scene->clip;
 
-	if (!clip || !data->track[0])
+	if (!clip || !data->track[0] || !camob)
 		return;
 
 	tracking= &clip->tracking;
@@ -3975,12 +3977,8 @@
 			float pos[3], mat[4][4];
 
 			if((tracking_object->flag&TRACKING_OBJECT_CAMERA)==0) {
-				Object *camob= scene->camera;
 				float obmat[4][4], imat[4][4];
 
-				if(!camob)
-					return;
-
 				copy_m4_m4(mat, camob->obmat);
 
 				BKE_tracking_get_interpolated_camera(tracking, tracking_object, scene->r.cfra, obmat);
@@ -4000,77 +3998,73 @@
 		}
 	} 
 	else {
-		Object *camob= scene->camera;
+		MovieClipUser user;
+		MovieTrackingMarker *marker;
+		float vec[3], disp[3], axis[3], mat[4][4];
+		float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
+		float len, d;
 
-		if (camob) {
-			MovieClipUser user;
-			MovieTrackingMarker *marker;
-			float vec[3], disp[3], axis[3], mat[4][4];
-			float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
-			float len, d;
+		where_is_object_mat(scene, camob, mat);
 
-			where_is_object_mat(scene, camob, mat);
+		/* camera axis */
+		vec[0]= 0.0f;
+		vec[1]= 0.0f;
+		vec[2]= 1.0f;
+		mul_v3_m4v3(axis, mat, vec);
 
-			/* camera axis */
-			vec[0]= 0.0f;
-			vec[1]= 0.0f;
-			vec[2]= 1.0f;
-			mul_v3_m4v3(axis, mat, vec);
+		/* distance to projection plane */
+		copy_v3_v3(vec, cob->matrix[3]);
+		sub_v3_v3(vec, mat[3]);
+		project_v3_v3v3(disp, vec, axis);
 
-			/* distance to projection plane */
-			copy_v3_v3(vec, cob->matrix[3]);
-			sub_v3_v3(vec, mat[3]);
-			project_v3_v3v3(disp, vec, axis);
+		len= len_v3(disp);
 
-			len= len_v3(disp);
+		if (len > FLT_EPSILON) {
+			CameraParams params;
+			float pos[2], rmat[4][4];
 
-			if (len > FLT_EPSILON) {
-				CameraParams params;
-				float pos[2], rmat[4][4];
+			user.framenr= scene->r.cfra;
+			marker= BKE_tracking_get_marker(track, user.framenr);
 
-				user.framenr= scene->r.cfra;
-				marker= BKE_tracking_get_marker(track, user.framenr);
+			add_v2_v2v2(pos, marker->pos, track->offset);
 
-				add_v2_v2v2(pos, marker->pos, track->offset);
+			camera_params_init(&params);
+			camera_params_from_object(&params, camob);
 
-				camera_params_init(&params);
-				camera_params_from_object(&params, camob);
+			if (params.is_ortho) {
+				vec[0]= params.ortho_scale * (pos[0]-0.5f+params.shiftx);
+				vec[1]= params.ortho_scale * (pos[1]-0.5f+params.shifty);
+				vec[2]= -len;
 
-				if (params.is_ortho) {
-					vec[0]= params.ortho_scale * (pos[0]-0.5f+params.shiftx);
-					vec[1]= params.ortho_scale * (pos[1]-0.5f+params.shifty);
-					vec[2]= -len;
+				if (aspect > 1.0f) vec[1] /= aspect;
+				else vec[0] *= aspect;
 
-					if (aspect > 1.0f) vec[1] /= aspect;
-					else vec[0] *= aspect;
+				mul_v3_m4v3(disp, camob->obmat, vec);
 
-					mul_v3_m4v3(disp, camob->obmat, vec);
+				copy_m4_m4(rmat, camob->obmat);
+				zero_v3(rmat[3]);
+				mul_m4_m4m4(cob->matrix, rmat, cob->matrix);
 
-					copy_m4_m4(rmat, camob->obmat);
-					zero_v3(rmat[3]);
-					mul_m4_m4m4(cob->matrix, rmat, cob->matrix);
+				copy_v3_v3(cob->matrix[3], disp);
+			}
+			else {
+				d= (len*params.sensor_x) / (2.0f*params.lens);
 
-					copy_v3_v3(cob->matrix[3], disp);
-				}
-				else {
-					d= (len*params.sensor_x) / (2.0f*params.lens);
+				vec[0]= d*(2.0f*(pos[0]+params.shiftx)-1.0f);
+				vec[1]= d*(2.0f*(pos[1]+params.shifty)-1.0f);
+				vec[2]= -len;
 
-					vec[0]= d*(2.0f*(pos[0]+params.shiftx)-1.0f);
-					vec[1]= d*(2.0f*(pos[1]+params.shifty)-1.0f);
-					vec[2]= -len;
+				if (aspect > 1.0f) vec[1] /= aspect;
+				else vec[0] *= aspect;
 
-					if (aspect > 1.0f) vec[1] /= aspect;
-					else vec[0] *= aspect;
+				mul_v3_m4v3(disp, camob->obmat, vec);
 
-					mul_v3_m4v3(disp, camob->obmat, vec);
+				/* apply camera rotation so Z-axis would be co-linear */
+				copy_m4_m4(rmat, camob->obmat);
+				zero_v3(rmat[3]);
+				mul_m4_m4m4(cob->matrix, rmat, cob->matrix);
 
-					/* apply camera rotation so Z-axis would be co-linear */
-					copy_m4_m4(rmat, camob->obmat);
-					zero_v3(rmat[3]);
-					mul_m4_m4m4(cob->matrix, rmat, cob->matrix);
-
-					copy_v3_v3(cob->matrix[3], disp);
-				}
+				copy_v3_v3(cob->matrix[3], disp);
 			}
 		}
 	}
@@ -4162,6 +4156,7 @@
 	bObjectSolverConstraint *data= con->data;
 
 	func(con, (ID**)&data->clip, userdata);
+	func(con, (ID**)&data->camera, userdata);
 }
 
 static void objectsolver_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
@@ -4169,11 +4164,12 @@
 	Scene *scene= cob->scene;
 	bObjectSolverConstraint *data= con->data;
 	MovieClip *clip= data->clip;
+	Object *camob= data->camera ? data->camera : scene->camera;
 
 	if (data->flag & OBJECTSOLVER_ACTIVECLIP)
 		clip= scene->clip;
 
-	if(!scene->camera)
+	if(!camob || !clip)
 		return;
 
 	if (clip) {
@@ -4185,14 +4181,14 @@
 		if(object) {
 			float mat[4][4], obmat[4][4], imat[4][4], cammat[4][4], camimat[4][4], parmat[4][4];
 
-			where_is_object_mat(scene, scene->camera, cammat);
+			where_is_object_mat(scene, camob, cammat);
 
 			BKE_tracking_get_interpolated_camera(tracking, object, scene->r.cfra, mat);
 
 			invert_m4_m4(camimat, cammat);
 			mul_m4_m4m4(parmat, data->invmat, cammat);
 
-			copy_m4_m4(cammat, scene->camera->obmat);
+			copy_m4_m4(cammat, camob->obmat);
 			copy_m4_m4(obmat, cob->matrix);
 
 			invert_m4_m4(imat, mat);

Modified: branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c	2011-12-15 19:32:57 UTC (rev 42653)
+++ branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c	2011-12-15 20:38:23 UTC (rev 42654)
@@ -6818,14 +6818,28 @@
 				ListBase targets = {NULL, NULL};
 				bConstraintTarget *ct;
 				
-				if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) {
-					/* special case for object solver constraint because it doesn't fill
-					   constraint targets properly (design limitation -- scene is needed for
-					   it's target but it can't be accessed from get_targets callvack) */
-					if(scene->camera) {
+				if(ELEM(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_OBJECTSOLVER)) {
+					/* special case for object solver and follow track constraints because they don't fill
+					   constraint targets properly (design limitation -- scene is needed for their target
+					   but it can't be accessed from get_targets callvack) */
+
+					Object *camob= NULL;
+
+					if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
+						bFollowTrackConstraint *data= (bFollowTrackConstraint *)curcon->data;
+
+						camob= data->camera ? data->camera : scene->camera;
+					}
+					else if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) {
+						bObjectSolverConstraint *data= (bObjectSolverConstraint *)curcon->data;
+
+						camob= data->camera ? data->camera : scene->camera;
+					}
+
+					if(camob) {
 						setlinestyle(3);
 						glBegin(GL_LINES);
-						glVertex3fv(scene->camera->obmat[3]);
+						glVertex3fv(camob->obmat[3]);
 						glVertex3fv(ob->obmat[3]);
 						glEnd();
 						setlinestyle(0);

Modified: branches/soc-2011-tomato/source/blender/makesdna/DNA_constraint_types.h
===================================================================
--- branches/soc-2011-tomato/source/blender/makesdna/DNA_constraint_types.h	2011-12-15 19:32:57 UTC (rev 42653)
+++ branches/soc-2011-tomato/source/blender/makesdna/DNA_constraint_types.h	2011-12-15 20:38:23 UTC (rev 42654)
@@ -413,6 +413,7 @@
 	char	track[24];
 	int		flag, pad;
 	char		object[24];
+	struct Object *camera;
 } bFollowTrackConstraint;
 
 /* Camera Solver constraints */
@@ -427,6 +428,7 @@
 	int		flag, pad;
 	char		object[24];
 	float		invmat[4][4];	/* parent-inverse matrix to use */
+	struct Object *camera;
 } bObjectSolverConstraint;
 
 /* ------------------------------------------ */

Modified: branches/soc-2011-tomato/source/blender/makesrna/intern/rna_constraint.c
===================================================================
--- branches/soc-2011-tomato/source/blender/makesrna/intern/rna_constraint.c	2011-12-15 19:32:57 UTC (rev 42653)
+++ branches/soc-2011-tomato/source/blender/makesrna/intern/rna_constraint.c	2011-12-15 20:38:23 UTC (rev 42654)
@@ -330,6 +330,49 @@
 	memcpy(ikData->points, values, ikData->numpoints * sizeof(float));
 }
 
+static int rna_Constraint_cameraObject_poll(PointerRNA *ptr, PointerRNA value)
+{
+	Object *ob= (Object*)value.data;
+
+	if (ob) {
+		if (ob->type == OB_CAMERA && ob != (Object*)ptr->id.data) {
+			return 1;
+		}
+	}
+
+	return 0;
+}
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list