orient_normals — 3D normals_orient op

• Data kinds: points × normals → normals

• Call: import fullseye as fs; fs.ledger.orient_normals(points, normals, k: 'int' = 20, seed_dir=None) -> 'np.ndarray' (implementation को सीधे call करना हो तो import normals_orient; normals_orient.orient_normals(points, normals, k: 'int' = 20, seed_dir=None) -> 'np.ndarray', registry से लेना हो तो ops3d.get("orient_normals"))

उपयोग

Hoppe method से normals को global रूप से एकरूप orient करता है (MST propagation)। → (N,3)।

kNN graph पर weight 1 - |n_i·n_j| (tangent planes जितने संरेखित, उतना सस्ता) वाला minimum spanning tree बनाता है, और seed से tree पर BFS करते हुए parent से उल्टे sign वाले children को पलटकर हर component को आंतरिक रूप से consistent बनाता है। Seed seed_dir दिए जाने पर उस दिशा में सबसे अधिक बाहर निकला point है, और न दिए जाने पर सबसे बाहरी point (centroid से सबसे दूर)। Graph कटा हुआ हो तो हर connected component के लिए स्वतंत्र रूप से seed लेकर propagate करता है (components के बीच relative दिशा की गारंटी नहीं)।

seed_dir देने पर, propagation से आंतरिक consistency के बाद component के सभी points के projections को एकत्र करके global sign को seed_dir से संगत करता है (एक seed के |cos| पर निर्भर नहीं होता, इसलिए seed point का normal seed_dir से लगभग orthogonal हो तब भी sign पक्के तौर पर तय होता है — finding [5])। seed_dir component के सभी normals से (लगभग) orthogonal हो और sign तय न हो सके, ऐसा सच्चा degenerate case fail-closed है (ValueError)। बंद सतहों (गोला आदि) पर जहाँ seed_dir औसतन normals से orthogonal हो, global sign अद्वितीय नहीं होता, इसलिए सबसे बाहर निकले point (= बाहर की ओर) पर आधारित दिशा बनाए रखता है। seed_dir न देने पर centroid से बाहर की ओर।

Args:

points: (N,3) point cloud।

normals: (N,3) अनिर्धारित दिशा वाले normals (अंदर unit length में normalise किए जाते हैं)।

k: kNN graph के neighbours की संख्या।

seed_dir: global reference दिशा (3,)। None होने पर centroid से बाहर की ओर को reference माना जाता है।

Returns:

global रूप से consistent sign वाले (N,3) unit normals।

Raises:

ValueError: जब seed_dir शून्य हो, या (किसी connected component में) सभी normals से orthogonal हो और

global sign नियंत्रित न किया जा सके (fail-closed)।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• blender_interop — Blender के साथ उपयोग — shape बनाएँ, fullseye से मापें (सावधानियाँ: axes, units, ground truth)

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• oriented_normals — py -3.11 examples_3d/oriented_normals.py

वे अगले ops जिनसे type जुड़ता है (normals को input के रूप में लेते हैं)

icp_point2plane · compute_fpfh · shot_descriptor · fuse_to_voxel · reflect · refract · normal_consistency · ransac_cylinder

इसी category के (normals_orient)

estimate_oriented_normals


*Provenance: normals_orient.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.