warp.mesh_query_point_sign_normal#
- warp.mesh_query_point_sign_normal( ) MeshQueryPoint#
Kernel
Differentiable
Compute the closest point on the
warp.Meshwith identifieridto the givenpointin space.Identifies the sign of the distance (inside/outside) using the angle-weighted pseudo normal. This approach to sign determination is robust for well conditioned meshes that are watertight and non-self intersecting. It is also comparatively fast to compute.
Triangles that are degenerate or nearly degenerate relative to their edge lengths are excluded from the closest-point search, so such a face can be skipped even when it satisfies the distance constraint. If every face satisfying the distance constraint is excluded, the query returns no result.
- Parameters:
id – The mesh identifier
point – The query point, in the mesh’s local space
max_dist – Maximum allowed distance to the returned closest point. The query returns no result if no face is strictly closer than this distance.
epsilon – Epsilon treating distance values as equal, when locating the minimum distance vertex/face/edge, as a fraction of the average edge length, also for treating closest point as being on edge/vertex default 1e-3.
- Returns:
A
warp.MeshQueryPoint. Checkresultfirst (Trueif a face withinmax_distwas found), then readsign(< 0 ifpointis inside the mesh, >= 0 if outside),face(index of the closest face), and the barycentric coordinatesuandvof the closest point on that face. Passface,uandvtomesh_eval_position()to obtain the closest point’s position.
Example
@wp.kernel def classify(mesh_id: wp.uint64, p: wp.vec3, out_inside: wp.array[wp.int32]): res = wp.mesh_query_point_sign_normal(mesh_id, p, 1.0e6) if res.result: out_inside[0] = wp.where(res.sign < 0.0, 1, 0) points = wp.array([[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]], dtype=wp.vec3) indices = wp.array([0,3,2, 0,2,1, 4,5,6, 4,6,7, 0,1,5, 0,5,4, 2,3,7, 2,7,6, 0,4,7, 0,7,3, 1,2,6, 1,6,5], dtype=wp.int32) mesh = wp.Mesh(points=points, indices=indices) out_inside = wp.zeros(1, dtype=wp.int32) wp.launch(classify, dim=1, inputs=[mesh.id, wp.vec3(0.5, 0.5, 0.5)], outputs=[out_inside]) print("inside:", bool(out_inside.numpy()[0]))
inside: True