[Bf-blender-cvs] [f5da9bc] fracture_modifier: corrected centroid calculation by using exact center of mass centroid
Martin Felke
noreply at git.blender.org
Mon Nov 7 18:11:19 CET 2016
Commit: f5da9bc3069f89340109294df171b22784c8495d
Author: Martin Felke
Date: Mon Nov 7 18:10:57 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBf5da9bc3069f89340109294df171b22784c8495d
corrected centroid calculation by using exact center of mass centroid
===================================================================
M source/blender/blenkernel/intern/fracture.c
===================================================================
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index c3176a5..fa5b29d 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -231,6 +231,39 @@ bool BKE_fracture_shard_center_median(Shard *shard, float cent[3])
return (shard->totvert != 0);
}
+/* note, results won't be correct if polygon is non-planar */
+/* copied from mesh_evaluate.c */
+static float mesh_calc_poly_planar_area_centroid(
+ const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray,
+ float r_cent[3])
+{
+ int i;
+ float tri_area;
+ float total_area = 0.0f;
+ float v1[3], v2[3], v3[3], normal[3], tri_cent[3];
+
+ BKE_mesh_calc_poly_normal(mpoly, loopstart, mvarray, normal);
+ copy_v3_v3(v1, mvarray[loopstart[0].v].co);
+ copy_v3_v3(v2, mvarray[loopstart[1].v].co);
+ zero_v3(r_cent);
+
+ for (i = 2; i < mpoly->totloop; i++) {
+ copy_v3_v3(v3, mvarray[loopstart[i].v].co);
+
+ tri_area = area_tri_signed_v3(v1, v2, v3, normal);
+ total_area += tri_area;
+
+ cent_tri_v3(tri_cent, v1, v2, v3);
+ madd_v3_v3fl(r_cent, tri_cent, tri_area);
+
+ copy_v3_v3(v2, v3);
+ }
+
+ mul_v3_fl(r_cent, 1.0f / total_area);
+
+ return total_area;
+}
+
/* modified from BKE_mesh_center_centroid */
bool BKE_fracture_shard_center_centroid(Shard *shard, float cent[3])
{
@@ -245,7 +278,9 @@ bool BKE_fracture_shard_center_centroid(Shard *shard, float cent[3])
/* calculate a weighted average of polygon centroids */
for (mpoly = shard->mpoly; i--; mpoly++) {
BKE_mesh_calc_poly_center(mpoly, shard->mloop + mpoly->loopstart, shard->mvert, poly_cent);
- poly_area = BKE_mesh_calc_poly_area(mpoly, shard->mloop + mpoly->loopstart, shard->mvert);
+ //poly_area = BKE_mesh_calc_poly_area(mpoly, shard->mloop + mpoly->loopstart, shard->mvert);
+ poly_area = mesh_calc_poly_planar_area_centroid(mpoly, shard->mloop + mpoly->loopstart, shard->mvert,
+ poly_cent);
madd_v3_v3fl(cent, poly_cent, poly_area);
total_area += poly_area;
}
More information about the Bf-blender-cvs
mailing list