김서버의 프론트엔드 일기

컴퓨터 그래픽스 - 2(모델링) 본문

공부하는거/컴퓨터 그래픽스

컴퓨터 그래픽스 - 2(모델링)

kimSerVer 2022. 8. 31. 00:06

3차원 물체를 표현하는 다양한 기법이 존재하지만, 실시간 그래픽스 영역에서는 폴리곤 메시를 압도적으로 많이 사용한다. 폴리곤 메시가 어떻게 생성되고, 저장이 되고 게임과 같은 런타임 응용프로그램으로 어떻게 전달이 되는지 알아보자

1. 폴리곤 메시

 폴리곤 메시는 부드러운 곡면을 근사적으로 표현한 것이다. 따라서 "얼만큼 정점을 많이 사용하여 근사하게 할 것인 가" 라는 고민은 용량과도 연결 되어 있으며, 이는 성능이슈와도 연결이 된다. 

 정점의 갯수가 많으면 해상도가 높다고 말하며, 적으면 해상도가 낮다고 표현한다.

 폴리곤 메시는 정점, 변, 면 으로 구성되며, 각종 3D 툴에서는 이런 면을 조작할 수 있는 기능들이 있다.

 폴리곤 메시 표현

 폴리곤 메시를 표현하는 가장 단순한 방법은 세 개의 정점을 순서대로 나열 하는 것이다. 

[
// 첫번째 삼각형 좌표 모음
 [0,0],
 [1,0],
 [0,1],
// 두번째 삼각형 좌표 모음
 [1,0],
 [1,1],
 [0,1],
 // 세번째 삼각형 좌표 모음
 [1,1],
 [1,0],
 [2,1]
]

 이렇게 표현할 경우, 겹치게 되는 포인트가 중복이 되면서 할당을 계속하게 되어서, 정점 배열과, 인덱스 배열 두 가지를 사용해서 표현하는 것이 일반적이다.

const 정점배열 = [
 [0,0],
 [0,1],
 [1,0],
 [1,1],
 [2,1]
]

const 인덱스배열 = [
// 첫번째 삼각형 좌표 인덱스 모음
 0,
 2,
 1,
 // 두번째 삼각형 좌표 인덱스 모음
 2,
 3,
 1,
 // 세번째 삼각형 좌표 인덱스 모음
 3,
 2,
 4
]

 정점 배열의 경우 16비트 부호 없는 정수형을 사용할 경우, 2^16(65536)개를 표현 할 수 있고, 32비트 인덱스를 사용하면 2^32(4294967296)개를 표현 할 수 있다.

 

2.  표면 노멀

 표면에 수직인 법선벡터를 말한다.

 삼각형 <p1,p2,p3>가 있을 때, p1 -> p2로 가는 정점을 v1이라 하고, p1 -> p3로 가는 정점을 v2라고 했을 때, 삼각형의 노멀은 v1과 v2의 벡터 곱을 v1과 v2 벡터 곱의 길이로 나눈 값이 된다.

const 삼각형노말 = v1 X v2 / ||v1 X v2||

 만약 삼각형의 정점이 <p1,p3,p2> 일 경우 v1과 v2의 위치는 바뀌게 된다.

 이 순서는 한 삼각형에 대해서 정점을 반시계 방향으로 나열 할 것인지, 시계 방향으로 나열 할 것인지로 달라지는 부분이며, OpenGL 쪽은 반시계를, direct3D계열은 시계방향으로 삼각형 정점을 표현하게 된다.

정점 노멀 

 정점 노멀은 해당 정점이 샘플한 곡면에 수직이어야 하는 것인데, 이는 그 정점에 연결되어 있는 모든 삼각형 노멀들의 평균을 취하는 방식이 가장 쉬운 방법이다. 

 하지만 실제로는 3D 제작툴들이 자동으로 계산 해주지만, 정점 노멀은 이후에 다른 개념을 이해하는 데에 있어서 가장 중요한 개념이다.