@@ -1360,44 +1360,38 @@ def sample_in_triangle(v0, v1, v2, n, random="pseudo", criteria=None):
13601360
13611361
13621362def make_sdf (vectors : np .ndarray ):
1363+ verts = vectors .reshape (- 1 , 3 )
1364+ v_min = verts .min (axis = 0 )
1365+ v_max = verts .max (axis = 0 )
1366+ max_dis = np .max (v_max - v_min )
1367+ norm_mesh = (verts - v_min ) / max_dis
1368+
1369+ mesh_vertices = [tuple (v ) for v in norm_mesh .tolist ()]
1370+ mesh_indices = np .arange (len (mesh_vertices ), dtype = np .int32 )
1371+
13631372 def sdf_func (points : np .ndarray , compute_sdf_derivatives = False ):
1364- points = points .copy ()
1365- x_min , y_min , z_min = np .min (points , axis = 0 )
1366- x_max , y_max , z_max = np .max (points , axis = 0 )
1367- max_dis = max (max ((x_max - x_min ), (y_max - y_min )), (z_max - z_min ))
1368- store_triangles = vectors .copy ()
1369- store_triangles [:, :, 0 ] -= x_min
1370- store_triangles [:, :, 1 ] -= y_min
1371- store_triangles [:, :, 2 ] -= z_min
1372- store_triangles *= 1 / max_dis
1373- store_triangles = store_triangles .reshape ([- 1 , 3 ])
1374- points [:, 0 ] -= x_min
1375- points [:, 1 ] -= y_min
1376- points [:, 2 ] -= z_min
1377- points *= 1 / max_dis
1378- points = points .astype (np .float64 ).ravel ()
1373+ pts = (points - v_min ) / max_dis
13791374
1380- # compute sdf values
1381- sdf = sdf_module .signed_distance_field (
1382- store_triangles ,
1383- np .arange ((store_triangles .shape [0 ])),
1384- points ,
1375+ input_points = [tuple (p ) for p in pts .tolist ()]
1376+
1377+ ret = sdf_module .signed_distance_field (
1378+ mesh_vertices ,
1379+ mesh_indices ,
1380+ input_points ,
13851381 include_hit_points = compute_sdf_derivatives ,
13861382 )
1383+
13871384 if compute_sdf_derivatives :
1388- sdf , sdf_derives = sdf
1385+ sdf , grad = ret
1386+ else :
1387+ sdf = ret
1388+ grad = None
13891389
1390- sdf = sdf .numpy ()
1391- sdf = np .expand_dims (max_dis * sdf , axis = 1 )
1390+ sdf = sdf .numpy ().reshape (- 1 , 1 ) * max_dis
13921391
1393- if compute_sdf_derivatives :
1394- sdf_derives = sdf_derives .numpy ().reshape (- 1 )
1395- sdf_derives = - (sdf_derives - points )
1396- sdf_derives = np .reshape (sdf_derives , (sdf_derives .shape [0 ] // 3 , 3 ))
1397- sdf_derives = sdf_derives / np .linalg .norm (
1398- sdf_derives , axis = 1 , keepdims = True
1399- )
1400- return sdf , sdf_derives
1392+ if grad is not None :
1393+ grad = grad .numpy ().reshape (- 1 , 3 )
1394+ return sdf , grad
14011395
14021396 return sdf
14031397
0 commit comments