CS/Computer Graphics

[Graphics Study] 모델링

Yeji Heo 2022. 10. 17. 15:26

모델링은 그래픽스 개발 단계에서 첫 단계에 해당하며, 렌더링 할 물체를 만드는 것을 의미한다. (mesh를 만드는 것)

 

1. 컴퓨터에서 모델링 개념

예를 들어 구를 모델링하려면 중점, 반지름을 통해 (x-Cx)^2+(y-Cy)^2+(z-Cz)^2=r^2과 같은 음함수로 표현을 할 것이다.

그런데 GPU는 음함수 처리에 적합하지는 않다.

그러므로 구의 표면의 점들을 sample한 후 서로 이어준다. 그럼 뭐가 될까요? polygun mesh~( GPU는 폴리건 메시에 최적화 돼 있다.)

 

가장 보편적이고 단순한 것은 Triangle Mesh(Open GL도 Triangle Mesh만 처리한다.)

대체로 삼각형의 개수는 꼭짓점 개수의 2배정도 된다.

3Ds Max나 Maya에서는 사각형 메시를 많이 쓴다.

그렇게 만든 사각형 메시를 삼각형으로 만드는 것은 쉽다.(반으로 자르기만 하면 됨)

 

정점의 개수도 속도 등을 좌우하므로 중요하다.

픽셀 개수를 Resolution(해상도)라고 하듯이, 메시에서도 해상도 또는 LOD라고 부른다.

 

2. 컴퓨터에서의 모델링 표현

아래와 같은 단순한 삼각형 메시가 있다고 해보자.

모든 정점을 배열로 저장하여(vertex array) 컴퓨터에서 나타내고 저장할 수 있다.

단, 이 방식은 중복된 데이터가 너무 많다.

한 정점을 다른 삼각형들이 공유하지만, 모두 표현을 해줘야 하기 때문이다.

 

그래서 중복되는 정점을 지우고, Index array를 따로 만들어 관리하면 더 효율적이다.

Index array라는 배열을 추가로 만들어야 해서 오히려 손해처럼 보이나요?? No.

Vertex array는 사실 Normals를 포함하여 수많은 정보를 담아야 한다(크기가 크다).

2~4Byte 정도의 작은 용량으로 생성되는 Index array를 만듦으로써 Vertex array를 줄일 수만 있다면

그 쪽이 훨씬 이득이겠죵

 

- Surface Normals

이는 표면에서 수직인 벡터(법선 벡터) 정보를 담는다.

1. Triangle Normals (삼각형 노말)

Triangle Mesh에서 법선 벡터를 구해보자.

p1 p2 p3 각 꼭짓점이 만드는 삼각형에서 p1-p2를 잇는 선이 v1, p1-p3가 v2라고 할 때, 

v1 -> v2에 오른손 법칙을 적용하면 엄지손가락의 방향이 삼각형과 수직이다. 

뭔가 익숙함.. 바로바로 Cross Product를 구하는 것과 같다! (v1 x v2)

+ 모든 Normals는 Unit Vector(단위 벡터)로 표현한다. 따라서 정규화(Normalization. 자기자신의 길이로 나눠주기)을 해야 한다. 

-> 즉, Normals = (v1 x v2) / (|| v1 x v2 ||)

 

* 유의점: 삼각형에서 꼭짓점은 반시계방향(CCW. Counter clockwise)으로 주어진다.

시계 방향(p1,p3,p2)으로 주어진다면 벡터 방향이 반대가 된다. 그럼 벡터가 물체의 안쪽을 향한다.

Graphics에서 Normals는 물체 바깥을 향하는 관례가 있으므로, 꼭짓점은 "반시계"방향으로 나열하시오!!

 

2. Vertex Normals (정점 노말)

Polygon mesh에서 정점의 Normals를 적당히 구해내는 방법이 뭘까?

정점을 둘러싸는 삼각형들의 각 Normals를 구하여 평균내면 된다.(물론 정규화도 해줘야 함)

 

3. Export & Import

블렌더로 메시를 만들어 Export하고 유니티에서 Import해 사용한 경험이 있다.

혹은 종종 Free3D에서 fbx, obj 형식의 파일들을 다운로드해서 사용했었다.

그 구조와 저장 방식에 대해서 공부할 수 있었다.

보통 Export는 .obj 형식으로 주로 이루어진다. 

구의 경우 각 정점마다 서로 다른 유니크한 Normals를 가진다.

반면, 오른쪽과 같은 도형은 정점이 다르더라도 Normal는 같다. 

 

정점은 v, 정점 노말은 vn으로 나타내며, 삼각형 정보는 f(face)로 나타낸다.

정점이 v(0.000, 1.000, 0.000), 정점 노말 vn((0.000, 1.000, 0.000)

삼각형 정보 f는 1//1 2//2 3//3 ( v//vn . 1//1이면 1번 v의 1번 vn이라는 뜻)

이런식으로 표현해서 .obj 등으로 저장하면, Import하는 쪽에서는 vertex array, Index array를 만들어낸다.

 

Vertex array는 vertex position, normals 등 정보를 담는다.

전체 삼각형 중 중복요소를 제외한 만큼의 요소를 Vertex array가 담고있으며,

삼각형 개수 x 3(각 꼭짓점)만큼의 요소를 Index array가 담고 있을 것이다.