본문 바로가기

Machine Learning Tasks/3D

3d object 파일 읽기

반응형

최근 메타버스, AR/VR 솔루션이 각광받으면서 3차원 모델링에 대한 딥러닝 연구도 활발히 진행되고 있습니다. 3차원 데이터는 2차원인 이미지와 달리 Z 축을 포함한 3개의 축으로 데이터를 표현하기 때문에 카메라가 바라보는 각도에 따라 물체를 합성할 수 있고 뎁스 정보를 이용한 보다 정확한 이미지 변주가 가능합니다. 가장 간단한 예로는 여러 각도에서 촬영한 어떤 물체의 이미지를 통해 그 물체의 3차원 데이터를 모델링할 수 있다면 다른 각도에서 그 물체를 촬영했을 때의 이미지를 생성해 낼 수 있는 거죠. 이번 포스트에서는 3차원 모델링의 핵심은 3차원 데이터의 구조 및 해석 방법에 대해 알아보도록 하겠습니다.

 

3차원 데이터

이미지는 2차원, 높이/너비의 픽셀로 구성되어 있습니다. 특정 높이/너비 위치에 있는 픽셀에 0-255 사이의 정수값이 담기고, 같은 위치에 여러 개의 픽셀 (예를 들어 RGB)이 있다면 그것을 딥러닝에서는 채널 (channel)이라 부릅니다. 3차원 데이터는 여기서 z 축이 추가된 3개의 축으로 데이터를 표현합니다. 그렇다면 3차원으로 표현된 여러 점 (이미지에서의 픽셀) 들이 모여 하나의 3차원 대상을 (3d object) 구성할 텐데 그것을 어떻게 표현할까요?

Vertex / Face / Edge

Figure 1의 오른쪽 토끼를 보면 여러 점들이 삼각형을 이루면서 모여있습니다. 3차원 모델링에서는 3차원 공간 상의 어떤 한 점을 vertex라고 정의합니다. 그리고 인접한 vertex끼리 그은 선은 edge라고 하며, 3개의 vertex가 모인 삼각형의 한 면을 face라고 정의합니다. (물론 사각형/오각형도 가능하지만 최소한의 면 구성은 삼각형으로 가능하기 때문에 일반적으로 삼각형을 사용합니다) 즉, 3차원 대상은 3차원 공간 상의 vertex가 구성하는 face의 집합으로 표현이 가능합니다. 물론 vertex 로만 3차원 대상 구성이 가능하나 face가 정의되지 않으면 Figure 1의 오른쪽 주전자처럼 빈 공간상에 점이 흩뿌려진 모양이 되겠죠. (정확히는 이를 3d point cloud라고 합니다)

Figure 1. 3차원 object

object file

따라서 3차원 데이터의 최소 요건은 vertex, 여기에 머리카락같이 면으로 표현하기 힘든 특수한 경우를 제외하면 face까지를 포함합니다. 3차원 모델링에서는 vertex와 face정보를 object file이라는 약속된 포맷으로 정의하고 확장자는 *.obj 로 정합니다. *.obj 파일은 특수한 로직으로 저장된 파일이 아니고 특정한 포맷으로 작성된 텍스트 파일이기 때문에 일반 텍스트 편집기로도 수정이 가능하고 다음 양식으로 구성되어 있습니다. (From wikipedia)

# List of geometric vertices, with (x, y, z, [w]) coordinates, w is optional and defaults to 1.0.
v 0.123 0.234 0.345 1.0
v ... ...
# List of texture coordinates, in (u, v) coordinates, these will vary between 0 and 1.
vt 0.500 0.500
vt ... ...
# List of vertex normals in (x,y,z) form; normals might not be unit vectors.
vn 0.707 0.000 0.707
vn ... ...
# Polygonal face element (see below)
f 1 2 3
f 3/1 4/2 5/3
f 6/4/1 3/5/3 7/6/5
f 7//1 8//2 9//3

먼저 vertex를 x/y/z 차원의 값을 표현합니다. 각 값은 3차원 대상이 정의된 좌표계에서의 값이고 위에 나와있는 w는 homogeneous 좌표계를 표현할 때 사용하는데 일반적으로 1이고 무시합니다. (없다고 생각해도 무방합니다) 또한, 각 vertex 별로 색깔 정보를 담을 수 있는데 이 경우에는 x좌표, y좌표, z좌표, r, g, b로 표현하고 r/g/b 값은 0~1 사이의 값으로 표현합니다. Vertex 값을 적을 때는 먼저 vertex임을 나타내는 "v"를 적고 한 칸씩 띄면서 좌표값 혹은 색깔값을 순서대로 적으면 됩니다.

그다음으로 3차원 대상의 texture 좌표입니다. Figure 1은 3차원 대상에 texture가 입혀져 있지 않지만 3차원 object 구조에 맞게 미리 정의된 texture map이 있다면 Figure 2처럼 object에 색깔을 입힐 수 있습니다. Figure 2 밑에 사람 얼굴 가죽이 2차원으로 펼쳐진 그림이 texture map이라 하며 보통 UV map이라고도 합니다. vt로 표현된 texture 좌표는 UV map 상의 좌표로 0~1 사이로 표현됩니다. 즉, "vt 0.5 0.5"라고 하면 UV map의 정 중앙값이 되는 거죠.

Figure 2

마지막으로 vertex의 법선벡터 (normal vector)를 "vt" 키워드로 표현합니다. 법선벡터이긴 하지만 크기가 1인 유닛 벡터일 필요는 없으며, 해당 vertex가 인접한 face의 표면 법선 벡터의 가중평균으로 표현됩니다. 여기까지 3d object file에서 vertex 구성요소를 보았는데, 3d object file이 동작하도록 하는 최소 요건은 vertex ("v")만 있어도 표현이 가능합니다. "vt", "vn"은 텍스쳐, 빛에 의한 음영 (shading)을 표현하기 위한 추가적인 정보이고요. 단, "v" 정보만 있으면 Figure 1의 주전자처럼 point cloud로 표현되겠죠.


다음으로는 vertex 3개가 모여 구성하는 face 포맷입니다. 하나의 면은 3개의 vertex로 구성되어 있기 때문에 face를 구성하는 vertex의 인덱스로 표현합니다. 즉, "f v1 v2 v3"로 표현하면 1,2,3번 vertex로 구성된 face임을 나타내는 것이고 인덱스는 1부터 시작합니다. Vertex의 순서는 시작점 상관없이 오른손 법칙을 따르기 위해 시계 반대 방향 (counter-clockwise)로 표현합니다. 또한 face에도 texture 좌표, normal 정보를 담을 수 있는데요, "f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3"로 표현하면 해당 face의 색깔은 1,2,3번 texture 좌표로부터 가져오겠다는 말입니다. Normal 좌표도 마찬가지로 동작합니다.

Face를 구성할 때 주의할 점은 1) 인덱스는 1부터 시작하며, 2) texture 좌표, normal 벡터는 없어도 되나 구성하는 vertex index는 무조건 포함되어야 한다는 점입니다. 또한, texture 좌표만 표현하고 싶지 않다면 "f v1//vn1 v2//vn2 v3//vn3"와 같이 slash로 texture 좌표의 인덱스가 아님을 표현해야 합니다.

 

3d 프로그램

그럼 3d object 파일을 읽는 프로그램은 어떤 것을 사용할까요? 대표적인 무료 프로그램으로 Meshlab, blender가 있습니다만 저는 아직 초보라 사용방법이 간단한 meshlab을 선호합니다. 특히, meshlab은 object 파일 드래그로 바로 3차원 형태를 볼 수 있고 vertex, face 개수 및 조작이 매우 간편합니다. 블렌더는 기능이 엄청 많은 만큼 3차원 디자이너가 많이 사용하지만 초보자가 바로 사용하기에는 적합하지는 않다고 생각이 드네요...

 

MeshLab

--> MeshLab the open source system for processing and editing 3D triangular meshes. It provides a set of tools for editing, cleaning, healing, inspecting, rendering, texturing and converting meshes. It offers features for processing raw data produced by 3D

www.meshlab.net

 

blender.org - Home of the Blender project - Free and Open 3D Creation Software

The Freedom to Create

www.blender.org

 

참조

반응형