3D Object Modeling이란?
3D 오브젝트 모델링은 현실의 물체를 컴퓨터 내부에서 정규화된 형식의 데이터로 표현(Representation)하는 과정이라고 정의할 수 있습니다.
즉, 물체를 3차원 공간에 존재하는 대상으로 가정하고, 이를 일정한 규칙에 따라 데이터 형태로 변환하여 저장·활용 가능하게 만드는 작업입니다.
Representation(표현)이란?
Representation은 “어떤 대상을 어떤 방식으로 표현할 것인지”, 그리고 “어떤 데이터 구조로 변환하여 저장할 것인지”를 의미합니다.
결과적으로는 저장되는 데이터의 형식이 중요하며, 이 형식에 따라 이후의 처리(렌더링, 변형, 애니메이션 등) 방식이 달라집니다.
또한 3D 데이터는 고정되어 있지 않고, 캐릭터의 움직임처럼 형태가 변하는 상황이 발생합니다. 따라서 “데이터가 변할 때도 일관되게 표현하고 처리할 수 있는가”가 핵심 과제가 됩니다.
이처럼 대상을 효율적으로 저장하고, 화면에 올바르게 표현하며, 변화에 대응하는 방법을 다루는 분야가 컴퓨터 그래픽스(Graphics)입니다. 모델링 과정에서는 “표현에 필요한 데이터를 어떻게 생성할 것인가” 또한 중요한 논점이 됩니다.
이 글에서 다루는 방식: Polygonal Representation
대상을 표현하는 방법은 여러 가지가 있으나, 본 글에서는 그중 가장 보편적인 방식인 Polygonal Representation(폴리곤 표현)을 다룹니다.
폴리곤 표현은 다음 요소로 구성됩니다.
•
Vertex(정점)
•
Edge(모서리/변)
•
Face(면)
Polygonal Representation의 핵심 개념
Polygonal Representation은 말 그대로 대상을 다각형(Polygon)으로 구성된 표면으로 표현하는 방식입니다.
예를 들어 사람 머리를 표현한다고 가정하면, 원자나 분자 단위까지 모두 모델링하는 것이 가장 정확하지만 이는 현실적으로 불가능합니다. 실제 3D 모델링 툴에서는 보통 물체의 내부를 모두 만들지 않고, 겉으로 보이는 표면만 구성합니다.
이는 최종적으로 화면에 보이는 것이 표면이기 때문에, 내부 구조가 무엇인지보다 보이는 표면이 어떻게 형성되는지가 더 중요하기 때문입니다.
이처럼 물체를 “껍데기(경계)” 중심으로 표현하는 방식을 Boundary Representation(경계 표현, B-Rep)이라고 부릅니다.
다음 질문
따라서 핵심 질문은 다음과 같습니다.
“이 표면(껍데기, 경계)을 어떤 방식으로 표현할 것인가?”
이에 대한 대표적인 해답 중 하나가 바로 Polygonal Representation(폴리곤 표현)입니다.
위 그림처럼 부드러운 곡면이 있다고 가정합니다. 실제 3D 그래픽스에서 이 곡면은 “완전히 매끈한 곡면” 그대로 저장되는 경우가 많지 않습니다. 대신 여러 개의 작은 면으로 **분할(테셀레이션)**되어 표현됩니다. 즉, 곡면은 많은 폴리곤 조각이 모여 만들어진 근사(approximation) 결과입니다.
이처럼 “조각내어 표현”하는 이유는 다음과 같습니다.
곡면을 수학적 형태(연속적인 곡면 방정식)로 정확하게 저장하고, 그 위에서 렌더링·충돌·변형·조명 계산까지 수행하는 것은 비용이 큽니다. 반면, 삼각형(또는 사각형)으로 분할해 두면 정점(Vertex) 좌표만으로 형태를 표현할 수 있으며, 이후 처리(렌더링 파이프라인, 셰이딩 등)를 표준화하기 쉽습니다. 결과적으로 폴리곤 기반 표현은 현실적인 성능과 구현 난이도 측면에서 매우 효율적인 선택입니다.
Polygonal Representation 의 장점
1. 어떤 것이든 똑같은 데이터로 저장하면 된다. (삼각형이면 삼각형의 데이터로만 표현하면 된다.)
2. Graphic Pipeline을 만들기 쉽다.
3. Shading Algorithm 만들기 쉽다.
4. 데이터가 작다.
Polygonal Representation 의 단점
1. 물체를 완벽히 표현하지 못한다. 근사적으로 표현해야 한다.
2. 데이터 일부를 잃어버린다.
3. 속에 뭐가 있는지 관심이 없다.
4. 컴퓨터 입장에서는 편하다. 그러나 사람이 쓰기 좋은 데이터는 아니다.
장점과 단점이 있지만, 장점이 너무 좋아서 대부분 Polygonal Representation을 사용한다고 한다.
왼쪽 토끼는 속까지 데이터가 존재한다. 왼쪽 토끼를 Polygonal 으로 표현한 것이 오른쪽 토끼이다.
Elements
다각형들이 모아놓은 것, 붙어있는 것들을 Mesh라고 한다. Mesh의 일부분을 보자. 딱 다각형(삼각형) 두개만 가져와보았다.
vertex가 있고, vertex 두개를 이으면 edge가 되고, edge로 둘러싸여 있는 것을 face라고 부른다.
Face
Face가 삼각형인지 아닌지부터 확인해야 한다. 삼각형이면 많이 쉬워지기 때문이다. 왜 쉬워질까?
점 세개 이상이면 도형이 이상하게 그려지기 쉽다.
이렇게 점 다섯개가 있다고 하자. 이제 5각형을 그려보자.
생각했던 5각형은 왼쪽이었지만, 실제로 오른쪽과 같이 그려질 가능성이 있다.
하지만 삼각형은 이럴 일이 없다.
이 외에도 삼각형을 쓰는 이유는 여럿 있다.
1. 면적을 계산하기 쉽다.
2. face 평면의 normal vector를 알 수 있다.
=> vertex가 4개 이상이 되면 만들어질 수 있는 평면이 하나가 아니기 때문에, face 방향을 하나로 정해줄 수 없다.
=> 근데 이게 왜 장점? 어떤 점이 그 평면에 들어가는지 알 수 있기 때문에. 이 면이 얼마나 광원을 바라보고 있는지 알 수 있어서 밝기 조절이 가능
3. Implicit 식이 쉽다. ( Ax + By + Cz + D = 0 )
4. convex 하다. ( 모든 내각이 예각이다. )
5. Hole이 없었으면 한다.
6. data structure 만들기가 편하다. 모든 평면은 점 3개만 있으면 된다.
7. 삼각형으로 오각형, 육각형 등 다른 도형도 만들 수 있다.
(참고) Hole
점 다섯 개로 한붓그리기를 통해 별을 그렸다. 그런데 가운데 영역은 별 안쪽인가? 바깥쪽인가? 헷갈리게 된다. 이처럼 의도한 것과 다르게 그려진 영역을 Hole이라고 한다.
Edge
Edge가 가지고 있어야 할 것은?
1. 길이
2. Mesh의 가장자리에 있는지, 가운데에 있는지. (쉐이딩할 때 사용)
=> ex) 만화에서 겉에 선이 있는 표현을 위해
Mesh가 가장자리에 있는지 아닌지 어떻게 알까?
바로 Edge의 양쪽에 Face가 두개 있으면 가운데에 있는 것이고, 한쪽에만 Face가 있다면 가장자리에 있는 것이다.
이러한 Mesh가 있다고 해보자.
빨간 Edge를 봐보자. 왼쪽에는 Face가 있지만 오른쪽에는 Face가 없다. 그러므로 이 빨간 Edge는 가장자리에 있다고 말할 수 있다.
이번엔 이 빨간 Edge를 봐보자. 왼쪽에도 Face가 있고, 오른쪽에도 Face가 있다. 그러므로 이 빨간 Edge는 가운데에 있다고 말할 수 있다.
그렇다면 모든 Edge가 두개의 Face를 가지고 있으면 어떻게 될까?
이 경우는 막혀있는 경우이다. 빙 둘러져 있어 끊긴 부분이 존재하지 않는다. Solid라고 부른다.
Vertex
Vertex가 가지고 있어야 할 것은?
1. Vertex 가 속해있는 다각형
발그림 죄송합니다..ㅎ 삼각형 5개 있는 Mesh입니다.
이유1) 가운데 점을 옮기면 주위 다각형도 같이 따라 움직여야 함
이유2) 실제로 Face에 있는 normal을 구해내서 Vertex normal을 처리하면 훨씬 부드러운 연출을 할 수 있다.
•
Face normal 구하는 법: 아무 Edge 두개 잡고 이 Edge를 Cross Product하고 길이를 1로 만들어주면 Face normal이 나옴
•
Vertex normal 구하는 법: 주변 Face normal을 구해서 처리함. (처리하는 방식은 그때그때마다 다름)
이런 식으로 Vertex normal을 계산해야 부드럽게 렌더링 표현할 수 있다. 그렇기에 Vertex는 주변에 어떤 Polygon들이 있는지 알고 있어야 한다.
2. Texture coordinates
경우에 따라서 Texture coordinates를 알아야 하는 경우도 있다.
만약 사람 팔에 용 문신을 그리고 싶다해보자. 용 그림을 가져와서 사람 팔에 엎어놓는다. 엎어놓은 상태에서 렌더링을 해주면 마치 사람 팔에 용 문신이 있는 것처럼 보여진다. 그 때 각 점들이 용 그림에서 어떤 부분을 뜯어와서 팔에 붙혔는지 표시해야 할 필요가 있다.
그래서 각 점들은 그림에서 어느 부분인지 표시를 해준다. 이것을 Texture coordinates라고 한다.
Vertex의 데이터 저장
Vertex들을 어떤 데이터 structure에 넣어야 좋을까?
알 수 있는 제일 쉬운 방법이 Face Set (STL) 이다.
바로 삼각형 하나하나씩 저장하는 방법이다. 점 하나를 표현하기 위해 각 점의 좌표를 저장한다.
Face Set (STL)
그런데 여기서 가운데 점이 z12이었고, z12가 위로 올라갔다고 해보자. 어떻게 될까?
이렇게 삼각형 하나만 떠버린다. 왜이럴까?
삼각형은 자기의 Vertex들은 알고 있는데, 이 Vertex들이 자기와 연결된 다른 Face를 전혀 모른다. 그래서 다른 Face에 어떠한 영향을 주지 못한다. 그래서 이 Vertex를 건들면 Polygon이 째지게 된다.
또 문제는, 데이터를 봤더니 z12는 점 하나다. 그런데 붙어있는 Face는 5개이니 좌표가 중복해서 5번이나 쓰여있다. Data redemdancy가 높다고 말할 수 있다. 데이터 양이 커져버렸다.
요즘에 쓰는 Polygon은 매우매우 많다. 렌더링할 때 데이터를 보내줘야하기 때문에, 데이터 양을 최소화 해야 하는 요즘에 이 문제는 중요하다.
그래서 데이터를 줄이기 위해 만든 것이 Shared Vertex 이다.
Shared Vertex
말 그대로 Vertex를 공유한다는 뜻이다.
Face Set에서는 중복해서 사용했더라면, 이번엔 가운데 점을 딱 한번만 쓰자. 점 6개를 사용하는 것이다. 이러면 데이터 양을 줄일 수가 있다.
가운데 점에 붙어있는 Face들은 Face에서 저 Vertex가 포함되어 있는지 알 수 있다.
OBJ 파일로 저장되어 있다. 제일 Standard이다.
장점
•
중복되는 Vertex의 좌표보단, 숫자 하나씩 저장해서 데이터 양이 줄어든다.
•
중복되는 점이 하나만 들어있으니, 가운데 점을 움직여도 Polygon이 째지지 않는다.
•
Rendering이 빠르다.
=> Rendering할 때 데이터 주고 받는데 최소한의 데이터이고, Rendering하는데 필요한 데이터는 다 들어있다.
•
연산을 다 하고 하드웨어로 넘기니 하드웨어는 복잡한 연산할 필요없이 렌더링을 할 수 있다.
단점
•
Vertex 하나에 어떤 Face가 연결되어 있는지 알아보려면 데이터를 다 뒤져봐야 한다. Face가 N개면 O(N)이 걸림.
이 단점을 보완하기 위해 나온 것이 Halfedge structure이다.
Halfedge structure
Halfedge structure
Vertex 하나가 자기 위치만 가지고 있는 것보단 하나만 더 알자. 자기랑 붙어있는 Edge도 알자.
두 점을 연결한 Edge가 두개 있다. 각각의 Edge를 half edge라고 부르자. half edge는 자기 끝에 있는 vertex를 알고 있다. 그리고 자기랑 붙어있는 Face도 알고 있다. 그럼 Face는 half edge 하나만 알고 있으면 된다.
Halfedge-Based Libraries
1. CGAL
- Computational geometry
2. OpenMesh
- 더 많이 사용됨
- 다양한 일 가능
- High Poly <-> Low Poly 변환 가능
[참고]
Interactive Computer Graphics: A Top-Down Approach with Shader-based OpenGL 6th edition / 저자: Edward Angel, Dave Shreiner / 출판사: Pearson Education
















