Fix for vertex weighting of samples: the coordinate spaces of sample
authorLukas Tönne <lukas.toenne@gmail.com>
Tue, 16 Dec 2014 10:50:24 +0000 (11:50 +0100)
committerLukas Tönne <lukas.toenne@gmail.com>
Tue, 16 Dec 2014 10:50:24 +0000 (11:50 +0100)
location and vertex locations have to be consistent.

When these vectors are in different spaces there is usually a large
offset between them, leading to very uniform weights and interpolation
always in the center of a face.

object_physics_meadow/blob.py

index 0a918d8..6b23115 100644 (file)
@@ -239,6 +239,8 @@ def make_blobs(context, gridob, groundob, samples2D, display_radius):
     blob_group_clear(context)
     blobs = []
     
+    imat = groundob.matrix_world.inverted()
+
     blobtree = KDTree(len(gridob.data.vertices))
     for i, v in enumerate(gridob.data.vertices):
         co = gridob.matrix_world * v.co
@@ -256,7 +258,7 @@ def make_blobs(context, gridob, groundob, samples2D, display_radius):
         mverts = groundob.data.vertices
         for xy in samples2D:
             progress.progress_add(1)
-            
+
             # note: use only 2D coordinates for weighting, z component should be 0
             index = assign_blob(blobtree, (xy[0], xy[1], 0.0), nor)
             if index < 0:
@@ -273,7 +275,8 @@ def make_blobs(context, gridob, groundob, samples2D, display_radius):
             # calculate barycentric vertex weights on the poly
             poly = mpolys[spoly]
             sverts = list(poly.vertices)
-            sweights = poly_3d_calc(tuple(mverts[i].co for i in sverts), sloc)
+            # note: coordinate space has to be consistent, use sloc in object space
+            sweights = poly_3d_calc(tuple(mverts[i].co for i in sverts), imat * sloc)
 
             blob.add_sample(sloc, snor, spoly, sverts, sweights)