공부/컴퓨터 그래픽스

OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 03 모델링

bokob 2024. 6. 30. 02:54

3.1 폴리곤 메시(Polygon Mesh)

실시간 그래픽스 영역에서는 폴리곤 메시를 압도적으로 많이 사용한다.

위 사진은 구를 표현하는 기법 두 개를 나타낸다. 좌측은 음함수이고 우측은 폴리곤 메시이다.

음함수(implicit function) 

  • 음함수로 표현된 물체를 스크린에 랜더링하는 것은 쉽지 않음

폴리곤 메시(polygon mesh)

  • GPU에서의 처리가 최적화되어 있기 때문에 실시간 응용에서 선호된다.
  • 정점(vertex) 및 폴리곤과 같은 요소들을 명시적으로 정의하여 표현
  • 메시의 정점들은 부드러운 곡면을 샘플(sample)해서 얻어진 것이므로, 폴리곤 메시는 정확한 표현법이 아닌 근사적인 표현법이다.

 

  • 삼각형은 가장 간단한 폴리곤이고, 폴리곤 메시 중 가장 널리 쓰이는 것은 삼각형으로만 구성된 메시인 삼각형 메시(triangle mesh)
  • 일반적인 닫힌 메시(closed mesh)에서 삼각형의 개수는 정점 개수의 두 배 정도이다. 즉 n개의 정점이 있다면, 삼각형의 개수는 대략 2n이 된다.

참고

구멍이 없는 닫힌 메시에 대한 오일러 공식(Euler's polyhedron formula)

$v-e+f=2$

v,e,f는 각각 메시의 정점, 변, 면의 개수이다.

닫힌 삼각형 메시에서 하나의 변은 두 개의 면에 의해 공유되고, 하나의 면은 세 개의 변을 가진다.

따라서, 변을 하나씩 방묺하면서 그를 공유하는 면 두 개에 표시를 남기면, 모든 변 방문이 마쳐졌을 때에는 각각의 면에 세 개의 표시가 남게 된다. 즉, 메시의 변의 개수의 2배는 면의 개수의 3배가 된다.

$2e=3f$

e를 치환하면 다음과 같은 결과를 얻는다.

$f=2v-4$

메시의 크기가 커질수록 면의 개수 f는 정점의 개수 v의 2배에 수렴한다.


  • 모델링 작업을 위해서는 사각형 메시(quad mesh)가 선호된다.
  • 사각형 메시를 삼각형 메시로 바꾸는 가장 간단한 방법은 각 사각형을 두 개의 삼각형으로 분할하는 것

  • 폴리곤 메시의 정점 개수를 해상도(resolution)라고 한다.
  • 정점 개수가 많으면 해상도가 높아지게 되어 본래의 곡면과 비슷해지지만 메시를 처리하기 위한 시간이 증가하여 효율성이 떨어진다.

3.1.1 폴리곤 메시 제작

폴리곤 메시는 대개 3ds Max 등과 같은 그래픽스 패키지를 사용해 제작된다. 이렇게 제작된 폴리곤 메시는 파일에 저장되고 응용 프로그램으로 전달되어 런타임에 애니메이션되고 렌더링된다.

Maya에서 작업한 프로젝트

 

3.1.2 폴리곤 메시 표현

정점 배열(vertex array)

  • 정점들이 저장된 메모리 공간
  • 삼각형 메시를 표현하는 가장 단순한 방법은 삼각형을 구성하는 세 개의 정점을 순서대로 나열하는 것
  • 한 번에 세 개씩 정점을 읽어서 하나의 삼각형을 정의
  • 직관적이지만 중복된 데이터가 존재해서 비효율적

인덱스 배열(index array)

  • 정점 배열의 인덱스를 별도의 배열로 기록하는 공간
  • 정점 배열에는 정점들을 중복 없이 저장
  • 삼각형 당 세 개의 인덱스가 저장

일반적으로 정점 배열에는 정점 위치뿐만 아니라 다양한 데이터가 포함된다. 따라서 중복된 데이터를 제거하여 절약되는 정점 배열 공간은 인덱스 배열이 차지하는 공간 크기를 능가하게 된다.

 

3.2 표면 노멀(Surface Normal)

3차원 물체를 렌더링할 때 핵심적인 역할을 하는 것은 물체 표면의 노멀(surface normal), 즉 표면에 수직인 법선 벡터

3.2.1 삼각형 노멀

 

삼각형은 반시계 방향(counter-clockwise, CCW)으로 정점을 표현한다.

삼각형 <p1, p2, p3>에서 p1과 p2를 잇는 벡터를 v1, p1과 p3를 잇는 벡터를 v2 하자.

삼각형 노멀은 v1과 v2의 벡터곱으로 정의된다.

$n_{12} = \frac{v_1 \times v_2 }{ \lVert v_1 \times v_2 \rVert}$

컴퓨터 그래픽스에서는 기본적으로 모든 노멀을 단위 벡터로 표현한다.

 

정점의 순서가 시계 방향이면 다음과 같아진다.

 

오른손 법칙에 따르면, 반시계 방향으로 정렬된 정점은 물체 표면에서 바깥쪽을 향하는 노멀을 생성한다.

시계 방향으로 정렬된 정점은 물체 안쪽을 향하는 노멀을 생성한다.

컴퓨터 그래픽스에서 노멀은 물체 바깥을 향하게 하는 것이 원칙

따라서 삼각형의 정점은 항상 반시계 방향으로 정렬되어 있어야 한다.

 

3.2.2 정점 노멀(Vertex Normal)

컴퓨터 그래픽스에서 실제 중요한 것은 정점 노멀(vertex normal)이다.

위 사진처럼 부드러운 곡면을 샘플하여 폴리곤 메시의 정점을 얻었다고 해보자.

정점 노멀은 해당 정점이 샘플한 곡면에 수직이어야 한다.

 

원래의 곡면 없이 폴리곤 메시만 주어졌을 때, 정점 노멀을 계산하는 정답은 없다. 그럴듯한 결과를 내는 기법을 사용하는 것 뿐이다.

가장 간단한 방법은 위 사진처럼 하나의 정점을 공유하는 모든 삼각형 노멀들의 평균을 구하는 것이다.

정점 노멀은 3ds Max 등과 같은 패키지가 자동으로 계산한다.

 

3.3 폴리곤 메시 내보내기와 불러오기

폴리곤 메시는 그래픽스 패키지를 사용해 만들어지고, 파일에 저장되어 런타임 응용 프로그램으로 넘겨진다.

내보내기(export)

  • 하나의 응용에서 만들어진 데이터를 다른 응용에 적합한 형태로 출력하는 과정

불러오기(import)

  • 익스포트된 데이터를 읽어오는 과정

그래픽스 패키지는 내보내기를 위해 다양한 파일 포맷을 지원하는데, 3ds Max가 지원하는 대표적인 파일 포맷 중 하나는 .obj이다.

기본적으로 정점 위치와 노멀, 그리고 삼각형 정보를 저장한다.

정점 위치는 vertex의 앞 글자 v, 정점 노멀은 vertex normal의 앞 글자 vn, 삼각형은 face(면)의 앞 글자 f를 기호로 사용한다.

하나의 삼각형이 가진 세 개의 정점 정보는 각각 위치와 노멀의 쌍으로 기록되는데, 이 둘은 //로 구분된다.

이와 같은 .obj 파일은 불러오기를 통해 그래픽스 응용 프로그램의 메모리 공간으로 옮겨진다.

 

출처

[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용