orient_normals — 3D normals_orient op

데이터 종류: points × normalsnormals

호출: import 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)。

배경 지식 가이드(이 연산자 앞에 있는 물리·규약)

blender_interop — Blender との併用 — 形を作って fullseye で測る(軸・単位・正解データの罠)

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

oriented_normalspy -3.11 examples_3d/oriented_normals.py

타입이 이어지는 다음 연산자(normals 를 입력으로 받는 것)

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

같은 카테고리(normals_orient)

estimate_oriented_normals


*Provenance: normals_orient.py — 3D 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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