개요
현실의 실제 물체를 스캔할 때 Ridar 센서를 이용한 스캔에서 우리는 포인트 클라우드 데이터(PCD)를 얻을 수 있다. 실제 스케일과 측위와 모양에 맞는 디지털화 된 형태로, 스캔 모델링이나 공간 디지털트윈, 측위 등에 사용될 수 있다.
여기서는 이렇게 얻은 PCD 데이터를 메쉬로 직접 변환하여 사용하는 방법에 대해서 기술한다.
내가 정리한 총 3가지의 방법이 있다.
- PCD를 메쉬로 시각화 하여 직접 모델링 하는 방법. (Modeling, Retopology)
- CloudCompare 프로그램을 이용하여 PoissonRecon 기능으로 메쉬 변환하는 방법
- Blender의 Geometry Node를 주로 이용하여 메쉬로 변환하는 방법
1. PCD를 메쉬로 시각화 하여 직접 모델링 하는 방법
이 방법은 이전 글을 참고하면 된다.
포인트들을 메쉬로 보이게 만든 후 모델링을 처음부터 진행하는 방법.
참고 글
[Blender] pcd 포인트 클라우드 데이터를 블렌더에서 사용하기
2. CloudCompare의 PoissonRecon으로 메쉬화 하는 방법
.pcd 포맷 파일이 있다면 먼저 CloudCompare를 통해서 .ply 포맷으로 변경해야 한다. 블렌더에서는 ply 포맷이 호환되기 때문.
CloudCompare - Open Source project
www.danielgm.net
blender-pcd-io Add-on이 있긴 하지만 이를 이용하면 pcd 데이터의 vertex color가 없어진다. vertex color를 사용하지 않는다면 Add-on을 사용하는 편이 낫다.
GitHub - MarkHedleyJones/blender-pcd-io: Import and Export Point Cloud Data files from Blender 2.8+
Import and Export Point Cloud Data files from Blender 2.8+ - MarkHedleyJones/blender-pcd-io
github.com
pcd 파일을 넣고, [File] - [Save] 메뉴를 이용하여 ply로 저장한다. (BINARY 옵션으로 저장)

블렌더에서 ply를 열면 많은 포인트가 포함되어 있는 것을 볼 수 있다.

나중에 vertex color를 샘플링하여 텍스쳐를 만들 예정이라서 [Color Attibutes]에 Vertex - Color가 포함되어 있는 것을 확인한다.

밀도가 낮은 포인트를 손으로 직접 지운다. X-Ray를 켠 상태로 드래그하여 Verices를 지우면 편하다.


어느 정도 정리를 했다면 ply 포맷으로 export 하여 다시 CloudCompare에 import 한다. (import 할 때 디폴트 값 사용)

SOR 필터를 이용하여 포인트를 한 번 정리한다. 이웃한 포인트 수를 정하고 거리의 평균을 낸 후 평균 분포 범위 이상인 포인트는 지워진다.
- Number of points to use for mean distance estimation (k) : 각 점마다 평균 거리를 계산할 때 사용할 '가장 가까운 이웃 점'의 개수. 예를 들어, 값이 50이라면 각 점에서 가장 가까운 50개의 점과의 거리를 평균내어 해당 점의 '평균 거리'를 구한다. 값이 클수록 넓은 범위의 이웃을 참고하므로 노이즈에 덜 민감해지고, 값이 작을수록 국소적인 변화를 더 민감하게 감지할 수 있다.
- Standard deviation multiplier threshold (nSigma) : 이상치로 간주할 기준을 정하는 값. 모든 점의 평균 거리 값을 구한 뒤, 전체 평균과 표준편차를 계산한다. 그리고 "전체 평균 + nSigma × 표준편차"보다 평균 거리가 큰 점들은 이상치로 간주되어 제거된다. nSigma 값을 높이면(예: 2~3) 필터가 덜 공격적으로 동작해 극단적인 이상치만 제거하고, 값을 낮추면(예: 1) 더 많은 점이 이상치로 간주되어 제거된다.

메쉬 생성을 위한 각 포인트의 노말을 계산해야 한다. [Edit] - [Normals] - [Compute] 기능을 이용한다. (기본 값 사용)

각 포인트의 노말이 생겼으므로 이제 메쉬 생성을 위해서 [Plugins] - [PoissonRecon]으로 메쉬를 생성한다. (Octree 10)

메쉬가 생성된 것을 볼 수 있다. 메쉬가 포인트와 잘 맞는지를 확인한다. 만약 포인트가 없는 곳에 이상하게 메쉬가 만들어졌다면 SOR 필터를 이용하여 불필요한 포인트를 더 지우거나 블렌더에서 수동으로 튀어나와 있는 포인트를 지우면 된다.

이제 메쉬가 만들어졌기 때문에 fbx 포맷으로 export 한다. (FBX binary 선택)


export 된 fbx를 블렌더에서 열면 Rotation과 Scale이 안맞는데, 각각 0과 1로 맞춰주면 된다.


이제 블렌더에서 메쉬를 정리한다.
Remesh Modifier를 이용하여 메쉬를 정리한다. 해당 Modifier를 Apply 한다.

Remesh까지 했지만 메쉬는 아직 Non-Manifold인 부분이 많이 있다. 즉, 중간에 구멍이 나거나, 면이 겹쳐있거나 형태가 현실적이지 않은 부분이 있다는 것.
이 부분은 Edit 모드의 Edge 선택 상태에서 [Select] - [Select All by Trait] - [Non Manifold]를 선택하면 볼 수 있다.

Non Manifold 된 부분을 선택하여 움직여 본 모습. 상당히 많은 것을 알 수 있다.

이런 Non Manifold 형상을 Manifold로 수정하기 위해서 Add-on이 필요하다.
아래 사이트에서 다운로드 하거나 최신 버전의 블렌더라면 [Get Extensions]에서 검색하여 설치할 수 있다.
3D Print Toolbox
Utilities for 3D printing
extensions.blender.org

[Check All] 버튼을 누르면 어떤 부분이 Manifold 하지 않은지 알 수 있다. [Make Manifold] 버튼을 이용하여 자동으로 수정할 수 있다.

하지만 아쉽게도 이렇게 해도 여전히 Non Manifold 부분은 남아있다. 3D Print 툴의 [Hollow] 기능을 이용하여 구멍이 없는 메쉬를 다시 구성한다.
옵션 값은 남아있는 구멍이 메워질 알맞은 값을 적용하면 된다. (Offset 0.001m, Voxel Size 0.05~0.06m)

이후 겹쳐있을 버텍스나 엣지가 있을 수 있어서 Merge by Distance (0.001m) 한 번 한다.

마지막으로 Voxel로 되어있는 표면을 둥글게 하기 위해서 Shade Smooth를 하면 된다.

여기서, PCD 데이터에 포함된 Vertex Color를 메쉬에 직접 샘플링 해서 텍스쳐로 사용하고 싶다면 Geometry Node를 이용해야 한다.
먼저, 샘플링 하기 위해서 Vertex Color가 포함된 원본의 PLY 파일을 import 한다.

메테리얼에서 [Attribute] 노드를 생성하고 "Col" 이름의 attribute를 적용한 후 Base Color에 연결한다.

Geometry Node는 아래와 같이 연결한다. 그러면 Object 노드에서 설정된 원본 PLY의 Col attribute를 성공적으로 메쉬에 적용할 수 있다.

이것을 사용하기 위해서는 Texture에 Bake를 해야한다. 그 전에 이미지 텍스쳐를 하나 만들고 UV를 Unwrap 한다.


이제 Texture Bake를 하기 위해서 Render 세팅을 수정한다. Render Engine은 Cycles로 설정.

Bake Type은 Diffuse로 설정, Direct와 Indirect 설정은 체크 해제 했다.

Bake 버튼을 눌러서 성공적으로 베이크가 되었다면 텍스쳐를 직접 Base Color에 연결하여 확인할 수 있다.


이후 모델링은 fbx로 export 하고, 텍스쳐는 다운받아서 Unity에 import 한다. 적절한 조명을 배치하면 탄광 내부의 모습을 볼 수 있다.

3. Blender의 Geometry Node를 사용하여 메쉬화 하는 방법
2번 방법과 마찬가지로, .pcd 파일이 있다면 먼저 CloudCompare에서 .ply 파일로 변경해야 한다. 이는 Vertex Color를 사용하기 위한 것으로, 스캔 시 텍스쳐가 자동 생성되는 툴이 있다면 블렌더에서 바로 .pcd 파일을 불러와도 될 것이다.
.ply의 BINARY 옵션으로 저장한다.

.ply 파일을 블렌더에 import 한 후 Geometry Node만을 이용하여 메쉬로 변환한다.



*Distance 노드는 [Vector Math]를 검색하여 선택한다.
*불필요한 Group Input은 [Ctrl + H]로 단순화 한다.
*Group Sockets 파라미터 설정






프로젝트에 따라 Default 값이나 파라미터 값은 바뀔 수 있다. 메뉴로 만들었던 Type 부분을 바꿔가면서 Points/Vertices/Mesh 형태로 볼 수 있다. 변수를 다 입력해야 포인트가 나온다. (1mm, 20mm, 50mm 등)




이렇게 만들어진 메쉬는 Remesh 또는 Make Manifold를 했을 때 잘 작동하지 않는 것을 볼 수 있었다. 너무나 많은 부분이 Non Manifold 하기 때문인 것 같다...
바로 Shade Smooth를 한 후 UV Unwrap, Texture Baking을 진행한다.


베이크가 잘 되는 것을 볼 수 있었다.
4. SSDRecon 방식으로 CloudCompare에서 이미 생성된 메쉬에 PCD Vertex Color 샘플링 방법
SSDRecon 방식으로 만든 메쉬에 Vertex Color를 샘플링 하기 위해서는 GeometryNode를 사용하면 된다.

위와 같은 설정을 한 후 UV를 펴고 새 텍스쳐를 만들어서 Bake 하면 원본 색상을 샘플링하는 텍스쳐를 만들 수 있다.
*참고 영상
'Blender > 내용 정리&Tip' 카테고리의 다른 글
| [Blender] Blender 5.0 Overview - 새로운 기능 정리 (0) | 2025.11.28 |
|---|---|
| [Blender] PCD Scalar Field 사용하는 방법 정리 -최종 프로세스 (0) | 2025.09.25 |
| [Blender] 블렌더에서 텍스쳐 이미지 베이킹하기 (Baking Texture Image in Blender) (1) | 2025.05.26 |
| [Blender] GLB 파티클 애니메이션 제작 매뉴얼 (0) | 2025.04.28 |
| [Blender] pcd 포인트 클라우드 데이터를 블렌더에서 사용하기 (0) | 2025.01.15 |