본문 바로가기

ComputerGraphics [고려대학교_한정현]

3장 - 모델링 > Polygonmesh 의 Vertex Array 표현법

[출처 :컴퓨터그래픽스 고려대학교 - 한정현]

오늘은 모델링에서 Triangle  Polygon Mesh를 Data 로 풀어내고 파일로 옮기는 과정을 배울 것이다.

 목록1 : Triangle Polygon Mesh 를 데이터로 표현 하는 방법 

   방법1 : non indexed array 표현 

      - vector array 

   방법2 : Indexed array 표현방법 

      - Indexed array 

      - Vector array 

          : Vector + Vector normals 

 목록2 : 모델링 결과물이 Export 된 .obj 파일에  대한 공부. 

 목록3 : .obj 파일을 openGLES등에서 import 했을때의 결과

 

[모델링]
렌더링할 물체를 만들어 내는것

 

[음함수 vs Polygon Mesh]
 구의 중점과 구의 반지름을 가지고 음함수를 만들 수 있다.
 그래픽은 이런 음함수를 만들어내기에 적합하게 되어있지 않다.
 그래서 부드러운 점들을 찍은 샘플해서 만들어낸다.  
 일정한 갯수의 꼭지점들(정점) 들이 나오게 된다.
 그것들을 조밀조밀하게 이어 넣으면 poligon mesh  가 되는 것이다.
 GPU 는 이런 poligon mesh 를 처리하는데 아주 최적화 되었있다. 그래서 실시간 그래픽스에서는 이런 poligon mesh 를 사용한다.

 

[Triangle Polygon Mesh]

 OpenGL 은 Triangle Poligon mesh 만 받아들인다.
보통 꼭지점의 갯수의 2배정도의 삼각형으로 만들어진다.
실제 모델링 단계 ( 맥스, 마야 ) 에서는 사각형 메쉬를 만드는것이 더 유리하다.
그것을 반으로 나누면 삼각형이 되겠죠?

[Polygon mesh's Level of Detail]
 = 정점의 갯수를 어느정도로 할것인가 ( = 해상도 ) 

[Polygon mesh's Non indexed array 표현법 ]

어떤식으로 표현을 해야 할지

아래는 삼각형 메쉬를 vertex array 로  표현하는 방법을 보여주는 것이다.

중복 점들이 너무 많아서 리소스 낭비가 생긴다.

꼭지점을 배열에 넣는다. 배열을 3개씩 끊어 읽으면 삼각형 정보를 얻을 수 있다.   문제는 중복점들이 많다.

[Polygon mesh's Indexed Array표현법]

중점을 중복 없이 쓸 수 있는것이다. 정점을 배열에 넣어놓고, 그 인덱스를 이용해서 array 를 하나 더 만든다. (정점의 좌표값 :  자세히 들어가면 엄청 커진다., index좌표값 : 2B or 4B정도로 작성 가능 )

[Vertex Array 에 들어가야 하는 정보들]

 - Position 

 - Triangle's Normals ( 법선 벡터 )

 - Vertex's Normals ( 법선 벡터 ) 

 

[ Vertex Array 에 필요한 정보1: Surface Normals ]

 Vertex array 에 들어가는 정보는 많다. 그중  법선 벡터가 있다. 

 

  ex_1) 각 폴리곤 메쉬의 삼각형마다 법선벡터를 어떻게 구할까 ?

     - 꼭지점 p1 과 꼭지점 p2 를 이어서 v1 을 만든다.

       ( p1, p2 ,p3 는 시계 반대방향으로 주어진다.)

     - 꼭지점 p1 과 꼭지점  p3 를 이어서 v2 를 만든다. 

     - 두개의 vector (선분) 을 만들었을때 오른손 법칙을 한다. ( cross Product )

     - 마무리로 normalization를 통해서 unit Vector(단위벡터)로 만들어 준다.

삼각형의 Normals(법선벡터) 을 cross product 로 구하는 방법

 

  ex_2) 만약 시계 방향으로 꼭지점이 주어진다면 ? 법선벡터가 반대로 되겠다.

      그런데, 그래픽스에서는 원칙적으로 물체 반대방향으로 법선 벡터가 나와야 한다.

      따라서 이런 경우는 틀린 경우이다.

시계 방향으로 꼭지점이 주어지는경우  법선벡터가 물체 안쪽으로 향하게 된다. 그래픽스 원칙은  법선벡터 = 물체 바깥쪽으로 가야하므로 이런경우는 없어야한다.

 

  ex_3) 다음의 polygon mesh 를  vertex array , index array로 표현해보자.

  -  삼각형이 반시계 방향으로 표현되어야 하므로 index array가 다음과 같이 된다.

  -  시작점은 그렇게 중요하지 않다.

[Vertex Array 에 필요한 정보2: Vertex의 normals]

Triangle 의 normals 는 간단하다. 평면에 수직으로 나가면 되기 때문이다.

하지만 더 중요한 것은 Vertex Normals 을 구할 줄 알아야 한다.

 정점마다 법선벡터를 어떻게 구해야 하나? 
  ex_1) 아주 부드러운 평면이 있을때

     > tangent plane 에 수직인 normals를 vector 마다 정의해주면 되는 것이다.

부드러운 평면의 Vector's Normals

  ex_2)  부드러운 평면이 아니라 polygon mesh 만 주어지는 경우는 어떻게 해야하는가?

     정점을 공유하는 삼각형들의 normals 의 평균을 내는 방법을 쓴다. 

  tip ) 프로그래머는 벡터 고민할 필요 없다. 어차피 프로그램이 다계산해준다.

  tip_2) vertex array 는 vertex의 Normals 를 필수적으로 가져야 한다.!!!!

 

[모델링 파일 import , export]

 

디자이너가 mesh 를 만들어 주었을 때 openGLES로 렌더링 하기 위해서는 export import 를 통해서 데이터를 끌어와야 한다.

일반적으로 MAX (모델링) -> export -> FILE -> import -> openGLES

자신의 스크립트 언어를 이용해서 export 한다. 그 결과물 파일 포멧이 보통 .obj 파일이 나온다. 

 

[ .obj 파일 형식에 대한 공부] 

 다음은 26개의 vertices 와 48개의 triangles 가 나온 polygon mesh 의 

 export 결과물인 obj파일이다.

  - v : vertex positon (x,y,z)              26개

  - vn : vertex normals (unit vector)  26개  (동일한 normals 이 나오면 한개만 저장된다.)

  - f  : face (실제 삼각형정보) 48개

        꼭지점과 꼭지점법선벡터의 정보가 인덱스로 주어진다.  v//vn , v//vn, v/ /vn

마야 등의 모델링 프로그램에서 export 한 .obj결과물

[ .obj 파일을 import 했을때 결과물 ]

 vertex array : vertex, vertex normals 정보 26개 

 index array :  48삼각형 *3 개  = 144 개  

.obj 파일을 유니티, openGLES 에서 import 한 결과물 (중복된것은 끌어오지 않는다. )