raycast op• データ種: mesh × keypoints → table
• 呼び出し: 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) (実装を直接呼ぶなら import cadmap; cadmap.cad_pixel_to_surface(mesh, pixels, K=None, R=None, t=None, cull_backfaces=True, image_size=None, strict=False)、台帳から引くなら opscadmap.get("cad_pixel_to_surface"))
画素 (N,2) → CAD 面上の (face_id, 重心座標, 3-D 点)(閉形式)。
画素ごとに視線を作り(camera.py 規約: 中心は整数座標、u = 列、v = 行)、Möller-Trumbore で全三角形と交差させ、最も手前の当たりを採る。当たらない画素には face_id = -1 を返し、最寄りの面へは絶対に丸めない(検査で「欠陥が背景に載っていた」を「面 17 の欠陥」に化けさせないため)。cull_backfaces=True(既定)では法線がカメラを向いていない面は当たりにしない。
返りは dict:
• face_id (N,) int64 — 当たった三角形の行番号。miss は -1。
• bary (N,3) — 重心座標 (w0, w1, w2)、F[face_id] の 3 頂点の順。point = w0*V[i0] + w1*V[i1] + w2*V[i2] が厳密に成り立つ。miss は NaN。辺・頂点上では 1 成分が 0(許容 1e-9)。
• point (N,3) — 世界座標の交点。miss は NaN。
• depth (N,) — カメラ座標の Z(視線距離ではない)。miss は NaN。
• normal (N,3) — 当たった面の単位法線(世界座標、巻き方どおり)。miss は NaN(bary/point/depth と同じ規約)。
• hit (N,) bool。
• camera 実際に使われた K/R/t/width/height。既定に落ちた場合もここを見れば分かる。
• winding_fixed bool — 内向きに巻かれた閉メッシュを検出してこの呼び出しの中で巻きを直したかどうか。常に入る(False でも入る)。
cull_backfaces=True(既定)で mesh が閉じていて符号つき体積が負なら、既定では巻きを直して winding_fixed=True を返す。strict=True にすると直さず ValueError で拒否する。cull_backfaces=False のときは裏面判定をしないので巻き方向は結果に効かず、検査もせず winding_fixed は常に False(normal は入力の巻きどおりの符号で返る)。詳細は _orient_for_culling。
K/R/t を省くと mesh を画像に収める既定カメラを作る(R = I、カメラは重心の -Z 側)。image_size を省くと与えた画素の外接箱から画像サイズを決める — 既定カメラが画素のある場所を見るようにするためで、K を明示したときは in_image 判定にしか効かない。
• サンプルデータ カタログ(DL URL / ライセンス) — 2-D は skimage.data(BSD/public)+ 合成、3-D は実データ源(Stanford/PDS 等)の DL URL。
• 演算子の来歴・参考文献 — この op 族の元になった研究/手法の出典。
• アルゴリズムの正典(著者・年)と用途は上記ファミリ使い方ガイドに記載。
• defect_to_cad — py -3.11 examples/defect_to_cad.py
table を入力に取れる)—
raycast)—
*Provenance: cadmap.py — CADMAP operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.