[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(¶ms);
+ camera_params_from_object(¶ms, camob);
- camera_params_init(¶ms);
- camera_params_from_object(¶ms, 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