normals_orient oppoints × normals → normalsimport fullseye as fs; fs.ledger.orient_normals(points, normals, k: 'int' = 20, seed_dir=None) -> 'np.ndarray' (実装を直接呼ぶなら import normals_orient; normals_orient.orient_normals(points, normals, k: 'int' = 20, seed_dir=None) -> 'np.ndarray'、台帳から引くなら ops3d.get("orient_normals"))Hoppe 法で法線を大域一貫に向き付け(MST 伝播)。→ (N,3)。
kNN グラフ上に重み 1 - |n_i·n_j|(接平面が揃うほど安い)の最小全域木を張り、
種から木を BFS しながら親と符号が逆の子を反転させて成分を内部一貫にする。種は
seed_dir 指定時はその向きに最も突き出た点、未指定時は最外点(重心から最遠)。
グラフが分断されていれば連結成分ごとに独立に種を取り伝播する(成分間の相対向きは未保証)。
seed_dir を渡した場合、伝播で内部一貫化した後に成分全点の射影を集約して大域符号を
seed_dir に整合する(単一 seed の |cos| に依存しないので、seed 点の法線が
seed_dir と近直交でも符号は確実に決まる — finding [5])。seed_dir が成分の
全法線と(ほぼ)直交して符号を決められない真の退化は fail-closed(ValueError)。
閉曲面(球など)で seed_dir が平均的に法線と直交する場合は大域符号が一意でないため、
最突出点(=外向き)基準の向き付けを保持する。seed_dir 未指定時は重心から外向き。
Args:
points: (N,3) の点群。
normals: (N,3) の向き未定法線(内部で単位化)。
k: kNN グラフの近傍数。
seed_dir: 大域基準向き (3,)。None なら重心から外向きを基準にする。
Returns:
符号を大域一貫にそろえた (N,3) 単位法線。
Raises:
ValueError: seed_dir がゼロ、または(ある連結成分で)全法線と直交して
大域符号を制御できないとき(fail-closed)。
py -3.11 examples_3d/oriented_normals.pynormals を入力に取れる)icp_point2plane · compute_fpfh · shot_descriptor · fuse_to_voxel · reflect · refract · normal_consistency · ransac_cylinder
normals_orient)Provenance: normals_orient.py — 3D operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.