[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15255] branches/harmonic-skeleton/source/ blender: Distance parameter for retargeting.
Martin Poirier
theeth at yahoo.com
Tue Jun 17 23:01:11 CEST 2008
Revision: 15255
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15255
Author: theeth
Date: 2008-06-17 23:00:06 +0200 (Tue, 17 Jun 2008)
Log Message:
-----------
Distance parameter for retargeting. Keeps bones close to the embedding (pretty much the same thing as the correlation/distance parameter when generating).
This is very slow though, the naive approach to optimising the solution is starting to take its toll.
Modified Paths:
--------------
branches/harmonic-skeleton/source/blender/include/reeb.h
branches/harmonic-skeleton/source/blender/makesdna/DNA_scene_types.h
branches/harmonic-skeleton/source/blender/src/autoarmature.c
branches/harmonic-skeleton/source/blender/src/buttons_editing.c
branches/harmonic-skeleton/source/blender/src/reeb.c
Modified: branches/harmonic-skeleton/source/blender/include/reeb.h
===================================================================
--- branches/harmonic-skeleton/source/blender/include/reeb.h 2008-06-17 19:26:26 UTC (rev 15254)
+++ branches/harmonic-skeleton/source/blender/include/reeb.h 2008-06-17 21:00:06 UTC (rev 15255)
@@ -109,6 +109,7 @@
int start;
int end;
int stride;
+ int length;
} ReebArcIterator;
struct EditMesh;
Modified: branches/harmonic-skeleton/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/harmonic-skeleton/source/blender/makesdna/DNA_scene_types.h 2008-06-17 19:26:26 UTC (rev 15254)
+++ branches/harmonic-skeleton/source/blender/makesdna/DNA_scene_types.h 2008-06-17 21:00:06 UTC (rev 15255)
@@ -435,6 +435,7 @@
float skgen_symmetry_limit;
float skgen_retarget_angle_weight;
float skgen_retarget_length_weight;
+ float skgen_retarget_distance_weight;
short skgen_options;
char skgen_postpro;
char skgen_postpro_passes;
@@ -442,7 +443,6 @@
/* Alt+RMB option */
char edge_mode;
- char pad3[4];
} ToolSettings;
/* Used by all brushes to store their properties, which can be directly set
Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c 2008-06-17 19:26:26 UTC (rev 15254)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c 2008-06-17 21:00:06 UTC (rev 15255)
@@ -555,15 +555,49 @@
printf("\n");
}
-static float calcCost(ReebArc *earc, RigEdge *e1, RigEdge *e2, float *vec0, float *vec1, float *vec2, int i0, int i1, int i2)
+static float calcMaximumDistance(ReebArcIterator *iter, float *vec0, float *vec1, int i0, int i1)
{
- ReebArcIterator iter2;
EmbedBucket *bucket = NULL;
- float max_dist;
+ float max_dist = 0;
+ float v1[3], v2[3], c[3];
+ float v1_inpf;
+
+ VecSubf(v1, vec0, vec1);
+ v1_inpf = Inpf(v1, v1);
+
+ if (v1_inpf > 0)
+ {
+ int j;
+ for (j = i0; j < i1; j++)
+ {
+ float dist;
+
+ bucket = peekBucket(iter, j);
+
+ VecSubf(v2, bucket->p, vec1);
+
+ Crossf(c, v1, v2);
+
+ dist = Inpf(c, c) / v1_inpf;
+
+ max_dist = dist > max_dist ? dist : max_dist;
+ }
+
+ return max_dist;
+ }
+ else
+ {
+ return FLT_MAX;
+ }
+}
+
+static float calcCost(ReebArcIterator *iter, RigEdge *e1, RigEdge *e2, float *vec0, float *vec1, float *vec2, int i0, int i1, int i2)
+{
float vec_second[3], vec_first[3];
float angle = e1->angle;
float test_angle, length1, length2;
+ float max_dist;
float new_cost = 0;
VecSubf(vec_second, vec2, vec1);
@@ -588,45 +622,11 @@
new_cost += G.scene->toolsettings->skgen_retarget_length_weight * fabs((length2 - e2->length) / e2->length);
/* calculate maximum distance */
-// max_dist = 0;
-// for (initArcIterator2(&iter2, earc, i0, i1), bucket = nextBucket(&iter2);
-// bucket;
-// bucket = nextBucket(&iter2))
-// {
-// float v1[3], v2[3], c[3];
-// float dist;
-//
-// VecSubf(v1, vec0, vec1);
-// VecSubf(v2, bucket->p, vec1);
-//
-// Crossf(c, v1, v2);
-//
-// dist = Inpf(c, c) / Inpf(v1, v1);
-//
-// max_dist = dist > max_dist ? dist : max_dist;
-// }
-//
-// new_cost += G.scene->toolsettings->skgen_retarget_length_weight * max_dist;
-//
-// max_dist = 0;
-// for (initArcIterator2(&iter2, earc, i1, i2), bucket = nextBucket(&iter2);
-// bucket;
-// bucket = nextBucket(&iter2))
-// {
-// float v1[3], v2[3], c[3];
-// float dist;
-//
-// VecSubf(v1, vec1, vec2);
-// VecSubf(v2, bucket->p, vec2);
-//
-// Crossf(c, v1, v2);
-//
-// dist = Inpf(c, c) / Inpf(v1, v1);
-//
-// max_dist = dist > max_dist ? dist : max_dist;
-// }
-//
-// new_cost += G.scene->toolsettings->skgen_retarget_length_weight * max_dist;
+ max_dist = calcMaximumDistance(iter, vec0, vec1, i0, i1);
+ new_cost += G.scene->toolsettings->skgen_retarget_distance_weight * max_dist;
+
+ max_dist = calcMaximumDistance(iter, vec1, vec2, i1, i2);
+ new_cost += G.scene->toolsettings->skgen_retarget_distance_weight * max_dist;
return new_cost;
}
@@ -664,7 +664,7 @@
}
- current_cost = calcCost(iter->arc, e1, e2, vec0, vec1, vec2, i0, i1, i2);
+ current_cost = calcCost(iter, e1, e2, vec0, vec1, vec2, i0, i1, i2);
cost_cube[index * 3 + 1] = current_cost;
next_position = positions[index] + 1;
@@ -685,7 +685,7 @@
{
vec1 = bucket->p;
- cost_cube[index * 3 + 2] = calcCost(iter->arc, e1, e2, vec0, vec1, vec2, i0, next_position, i2) - current_cost;
+ cost_cube[index * 3 + 2] = calcCost(iter, e1, e2, vec0, vec1, vec2, i0, next_position, i2) - current_cost;
}
}
@@ -707,7 +707,7 @@
{
vec1 = bucket->p;
- cost_cube[index * 3] = calcCost(iter->arc, e1, e2, vec0, vec1, vec2, i0, next_position, i2) - current_cost;
+ cost_cube[index * 3] = calcCost(iter, e1, e2, vec0, vec1, vec2, i0, next_position, i2) - current_cost;
}
}
}
@@ -788,6 +788,7 @@
positions[i] += 1;
need_calc = i;
+
if (positions[i] + remaining_joints < earc->bcount)
{
break;
@@ -827,19 +828,33 @@
{
float vec_first[3], vec_second[3];
float length1, length2;
+ float max_dist;
+ float length_ratio;
float new_cost = 0;
+ int i1, i2;
if (i < nb_joints)
{
- bucket = nextNBucket(&iter, positions[i] - last_index);
+ i2 = positions[i];
+ bucket = peekBucket(&iter, positions[i]);
vec2 = bucket->p;
vec_cache[i + 1] = vec2; /* update cache for updated position */
}
else
{
+ i2 = iter.length;
vec2 = node_end->p;
}
+ if (i > 0)
+ {
+ i1 = positions[i - 1];
+ }
+ else
+ {
+ i1 = 1;
+ }
+
vec1 = vec_cache[i];
@@ -847,7 +862,7 @@
length2 = Normalize(vec_second);
/* check angle */
- if (i != 0)
+ if (i != 0 && G.scene->toolsettings->skgen_retarget_angle_weight > 0)
{
RigEdge *previous = edge->prev;
float angle = previous->angle;
@@ -865,15 +880,25 @@
}
else
{
- new_cost += M_PI;
+ new_cost += G.scene->toolsettings->skgen_retarget_angle_weight;
}
}
/* LENGTH COST HERE */
- new_cost += G.scene->toolsettings->skgen_retarget_length_weight * fabs((length2 - edge->length) / edge->length);
+ if (G.scene->toolsettings->skgen_retarget_length_weight > 0)
+ {
+ length_ratio = fabs((length2 - edge->length) / edge->length);
+ new_cost += G.scene->toolsettings->skgen_retarget_length_weight * length_ratio * length_ratio;
+ }
+
+ /* DISTANCE COST HERE */
+ if (G.scene->toolsettings->skgen_retarget_distance_weight > 0)
+ {
+ max_dist = calcMaximumDistance(&iter, vec1, vec2, i1, i2);
+ new_cost += G.scene->toolsettings->skgen_retarget_distance_weight * max_dist;
+ }
+
cost_cache[i] = new_cost;
-
- last_index = positions[i];
}
cost += cost_cache[i];
@@ -985,6 +1010,7 @@
initArcIterator(&iter, earc, node_start);
printPositions(best_positions, nb_joints);
+ printf("min_cost %f\n", min_cost);
printf("buckets: %i\n", earc->bcount);
/* set joints to best position */
@@ -996,7 +1022,7 @@
if (i < nb_joints)
{
- bucket = nextNBucket(&iter, best_positions[i] - last_index);
+ bucket = peekBucket(&iter, best_positions[i]);
vec1 = bucket->p;
}
else
@@ -1017,7 +1043,6 @@
}
vec0 = vec1;
- last_index = best_positions[i];
}
MEM_freeN(positions);
Modified: branches/harmonic-skeleton/source/blender/src/buttons_editing.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/buttons_editing.c 2008-06-17 19:26:26 UTC (rev 15254)
+++ branches/harmonic-skeleton/source/blender/src/buttons_editing.c 2008-06-17 21:00:06 UTC (rev 15255)
@@ -5011,8 +5011,9 @@
uiDefButF(block, NUM, B_DIFF, "T:", 1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0, "Specify the threshold ratio for filtering external arcs");
uiBlockEndAlign(block);
- uiDefButF(block, NUM, B_DIFF, "Angle:", 1025, 60, 125,19, &G.scene->toolsettings->skgen_retarget_angle_weight, 0, 10, 1, 0, "Angle Weight");
- uiDefButF(block, NUM, B_DIFF, "Length:", 1150, 60, 125,19, &G.scene->toolsettings->skgen_retarget_length_weight, 0, 10, 1, 0, "Length Weight");
+ uiDefButF(block, NUM, B_DIFF, "Ang:", 1025, 60, 83,19, &G.scene->toolsettings->skgen_retarget_angle_weight, 0, 10, 1, 0, "Angle Weight");
+ uiDefButF(block, NUM, B_DIFF, "Len:", 1108, 60, 83,19, &G.scene->toolsettings->skgen_retarget_length_weight, 0, 10, 1, 0, "Length Weight");
+ uiDefButF(block, NUM, B_DIFF, "Dist:", 1191, 60, 84,19, &G.scene->toolsettings->skgen_retarget_distance_weight, 0, 10, 1, 0, "Distance Weight");
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, SKGEN_SYMMETRY, B_DIFF, "Symmetry", 1025, 30,125,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Restore symmetries based on topology");
Modified: branches/harmonic-skeleton/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/reeb.c 2008-06-17 19:26:26 UTC (rev 15254)
+++ branches/harmonic-skeleton/source/blender/src/reeb.c 2008-06-17 21:00:06 UTC (rev 15255)
@@ -2365,6 +2365,8 @@
iter->stride = -1;
}
+ iter->length = arc->bcount;
+
iter->index = iter->start - iter->stride;
}
@@ -2387,6 +2389,8 @@
iter->index = iter->start - iter->stride;
+ iter->length = arc->bcount - start;
+
if (start >= arc->bcount)
{
iter->start = iter->end; /* stop iterator since it's past its end */
@@ -2410,6 +2414,8 @@
}
iter->index = iter->start - iter->stride;
+
+ iter->length = abs(iter->end - iter->start) + 1;
}
EmbedBucket * nextBucket(ReebArcIterator *iter)
More information about the Bf-blender-cvs
mailing list