project op• Data kinds: mesh × points → table
• Call: import fullseye as fs; fs.ledger.cad_surface_to_pixel(mesh, points, K=None, R=None, t=None, image_size=None, cull_backfaces=True, depth_tol=1e-06, strict=False) (to call the implementation directly, import cadmap; cadmap.cad_surface_to_pixel(mesh, points, K=None, R=None, t=None, image_size=None, cull_backfaces=True, depth_tol=1e-06, strict=False); from the registry, opscadmap.get("cad_surface_to_pixel"))
3-D points (N,3) → pixels plus visibility (occluded, back-facing and out-of-frame are told apart).
After projecting with camera.project_points, it re-casts a ray at the same pixel to check that no other face lies in front. Without this, the pixel coordinates of a hidden point would be returned as if "it is visible there". The return is a dict:
• uv (N,2) -- pixel (u=column, v=row). Even for points with depth <= 0 the projected value is returned, but in_front = False is set.
• depth (N,) -- camera coordinate Z.
• in_front (N,) bool -- depth > 0.
• in_image (N,) bool -- inside the image frame (0 <= u <= width-1 and 0 <= v <= height-1).
• occluded (N,) bool -- on the same line of sight, a face lies in front of the point.
• occluder_face (N,) int64 -- the occluding face. -1 if none.
• visible (N,) bool -- in_front & in_image & ~occluded.
• camera the camera actually used.
• winding_fixed bool -- whether an inward-wound closed mesh was detected and fixed.
depth_tol is a relative tolerance so that a point is not misjudged as "occluded by its own face"; it is judged occluded when z_hit < depth * (1 - depth_tol) - depth_tol. Points on the back side of a closed mesh are occluded by the near wall and get occluded = True -- this is by specification, not a miss.
The occlusion test depends on the winding direction (if the near wall is culled as a back face, even points on the back side become visible). Therefore with cull_backfaces=True an inward-wound closed mesh is detected, and by default the winding is fixed and winding_fixed=True is returned. With strict=True it raises ValueError; with cull_backfaces=False the check itself is not done (for details see _orient_for_culling).
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• defect_to_cad — py -3.11 examples/defect_to_cad.py
table as input)—
project)—
*Provenance: cadmap.py — CADMAP operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.