raycast op• Datenarten: mesh × keypoints → table
• Aufruf: import fullseye as fs; fs.ledger.cad_pixel_to_surface(mesh, pixels, K=None, R=None, t=None, cull_backfaces=True, image_size=None, strict=False) (die Implementierung direkt: import cadmap; cadmap.cad_pixel_to_surface(mesh, pixels, K=None, R=None, t=None, cull_backfaces=True, image_size=None, strict=False); aus dem Register: opscadmap.get("cad_pixel_to_surface"))
Pixel (N,2) → (face_id, baryzentrische Koordinaten, 3-D-Punkt) auf der CAD-Fläche (geschlossene Form).
Erzeugt pro Pixel einen Sehstrahl (camera.py-Konvention: Zentren auf ganzzahligen Koordinaten, u = Spalte, v = Zeile), schneidet ihn per Möller-Trumbore mit allen Dreiecken und nimmt den vordersten Treffer. Für Pixel ohne Treffer wird face_id = -1 zurückgegeben und niemals auf die nächstgelegene Fläche gerundet (damit in der Prüfung aus "der Defekt lag auf dem Hintergrund" nicht "ein Defekt auf Fläche 17" wird). Mit cull_backfaces=True (Standard) zählen Flächen, deren Normale nicht zur Kamera zeigt, nicht als Treffer.
Die Rückgabe ist ein dict:
• face_id (N,) int64 -- Zeilenindex des getroffenen Dreiecks. Bei miss -1.
• bary (N,3) -- baryzentrische Koordinaten (w0, w1, w2), in der Reihenfolge der 3 Ecken von F[face_id]. point = w0*V[i0] + w1*V[i1] + w2*V[i2] gilt exakt. Bei miss NaN. Auf Kanten und Ecken ist 1 Komponente 0 (Toleranz 1e-9).
• point (N,3) -- Schnittpunkt in Weltkoordinaten. Bei miss NaN.
• depth (N,) -- Z in Kamerakoordinaten (nicht der Abstand entlang des Strahls). Bei miss NaN.
• normal (N,3) -- Einheitsnormale der getroffenen Fläche (Weltkoordinaten, gemäß Umlaufsinn). Bei miss NaN (gleiche Konvention wie bary/point/depth).
• hit (N,) bool.
• camera die tatsächlich verwendeten K/R/t/width/height. Auch ob auf Standardwerte zurückgefallen wurde, sieht man hier.
• winding_fixed bool -- ob ein nach innen gewundenes geschlossenes Mesh erkannt und der Umlaufsinn innerhalb dieses Aufrufs korrigiert wurde. Immer vorhanden (auch wenn False).
Ist bei cull_backfaces=True (Standard) das mesh geschlossen und sein vorzeichenbehaftetes Volumen negativ, wird standardmäßig der Umlaufsinn korrigiert und winding_fixed=True zurückgegeben. Mit strict=True wird nicht korrigiert, sondern mit ValueError abgewiesen. Bei cull_backfaces=False findet kein Rückseitentest statt, daher wirkt der Umlaufsinn nicht auf das Ergebnis; es wird nicht geprüft und winding_fixed ist immer False (normal kommt mit dem Vorzeichen des Eingabe-Umlaufsinns zurück). Details unter _orient_for_culling.
Werden K/R/t weggelassen, wird eine Standardkamera erzeugt, die das mesh ins Bild fasst (R = I, Kamera auf der -Z-Seite des Schwerpunkts). Wird image_size weggelassen, bestimmt das umschließende Rechteck der gegebenen Pixel die Bildgröße -- damit die Standardkamera dorthin schaut, wo die Pixel liegen; ist K explizit angegeben, wirkt es nur auf den in_image-Test.
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• defect_to_cad — py -3.11 examples/defect_to_cad.py
table als Eingabe)—
raycast)—
*Provenance: cadmap.py — CADMAP Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.