본문 바로가기
IT/컴퓨터 그래픽스

[ 3D Modeling ] Polygonal Representation

by 신인용 2020. 10. 24.
반응형

 

Polygonal Representation

 

 

 

 

3D Object Modeling이란?

어떤 것들을 정규화된 형식으로 표현하는 것이라고 말할 수 있다.

어떤 물건 혹은 물체 등을 3차원에 존재하는 물건 혹은 물체 등으로 형식적인 방법으로 Representation하는 것이라고 할 수 있다.

 

 

 

Representation

어떻게 표현할 것인가. 어떤 데이터로 바꿔서 저장할 것인가.

결과적으로 데이터가 저장된 형식이 중요하다.

 

그런데 이 데이터가 바뀌니(캐릭터가 움직이는 등) 바뀌는 것에 대응하는 방법들을 고민해야 했다.

어떻게 하면 데이터를 잘 저장하고, 잘 표현할 지 고민하는 분야가 그래픽스 분야이다.

modeling에 필요한 데이터를 어떻게 만들까도 고민했다.

 

어떻게 표현할까에 대한 방법에는 여러가지가 있다.

이 글에서는 Polygonal Representation에 대해 알아보자.

Polygonal Representation

 - Face

 - Edge

 - Vertex

 

 

 

 

 

Polygonal Representation

 

말 그대로 Polygonal(다각형) 으로 Representation 한 것이다.

 

만약 사람 머리를 표현하고 싶다고 하자. 그럼 어떻게 해야할까?

분자 하나하나부터 표현하면 완벽하다. 하지만 이는 불가능하다.

 

마야나 맥스 등 3D modeling 툴을 다뤄보신 분은 알겠지만, 3D를 만들 때 이런 고민을 하지 않는다. 껍데기만 만들어줬기 때문이다. 왜냐? 결국엔 껍데기만 보이기 때문에 보이는 부분만 표현하면 속에 뭐가 들었든 중요하지 않다.

 

이것을 바로 껍데기로 표현하는 Boundary Representations (경계 표현) 이라고 할 수 있다.

그럼 이 껍데기를 어떻게 표현할 것인가?

 

 

위 그림처럼 부드러운 곡면이 있다고 하자. 이것을 표현할 때 사실 부드러운 곡면이 아닌, 쪼개져서 표현된다.

 

 

바로 이렇게 쪼개서 표현한다.

 

 

왜 쪼개서 표현할까? 곡면을 숫자로 표현하는 것은 어려운 일이다. 그런데 사각형으로 표현하면 점들로 쉽게 표현할 수 있다. 쪼개면서 쉬운 표현법이 생긴 것이다. 

 

 

 

 

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

 

반응형

댓글