cad_pixel_to_surface — CADMAP 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"))

Verwendung

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.

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• defect_to_cad — py -3.11 examples/defect_to_cad.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

—

Gleiche Kategorie (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.