"""Unsigned closest distance with solid-angle winding sign for a closed mesh. Avoid ray-parity misclassification at collinear CAD tessellation edges. """ import numpy as np import open3d as o3d def signed_distance(scene,mesh,points): p=np.asarray(points,dtype=np.float64) d=scene.compute_distance(o3d.core.Tensor(p.astype('float32'))).numpy() ids=np.flatnonzero(((p>=mesh.bounds[0])&(p<=mesh.bounds[1])).all(1)) triangles=np.asarray(mesh.triangles,dtype=np.float64) for start in range(0,len(ids),32): ix=ids[start:start+32];v=triangles[None]-p[ix,None,None,:];a,b,c=v[:,:,0],v[:,:,1],v[:,:,2];length=np.linalg.norm(v,axis=-1) numerator=np.einsum('bij,bij->bi',a,np.cross(b,c)) denominator=length.prod(-1)+(a*b).sum(-1)*length[:,:,2]+(b*c).sum(-1)*length[:,:,0]+(c*a).sum(-1)*length[:,:,1] winding=np.arctan2(numerator,denominator).sum(-1)/(2*np.pi) d[ix[np.abs(winding)>.5]]*=-1 return d