[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