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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs