2013년 6월 15일 토요일

[3D란 무엇인가?]


 
위에서 열심히 3D게임의 계보에 대해 대강 알아보았습니다. 여러 가지 그림도 보고 많은 게임들이 만들어 졌다는 것은 알겠지만, 3D 프로그래밍을 처음 접하게 되면 다른 프로그래밍과 달리 매우 많은 전문용어 때문에 혼선을 겪기에 마련입니다. 용어의 개념정리만 된다면 일차적으로 3D에 대한 많은 글들을 이해할 수 있기 때문에 이부분에서는 3D에서 사용되는 간단한 기초적인 용어들을 설명하겠습니다. 또한, 3D프로그래밍은 다른프로그래밍보다 좀 더 수학적 지식을 필요로 합니다. 기본적인 수학지식과 각종 수식들이 갖는 각각의 의미를 이해할 수 있어야 좀 더 쉽게 3D 프로그래밍을 배울 수 있을 것입니다. 그래서 이곳에서는 용어와 함께 3D 프로그래밍에서 쓰이는 간단한 수학과 그 의미를 알아 보도록 하겠습니다.
 
3D의 세계를 이해하기 위해서는 그것이 무엇으로 이루어졌는지 알아야 할 것입니다.
3D의 세계는 2D로 이루어진 평면적인 세계에 비해 좌표축이 하나 더 많다. 즉, x,y,z 로 이루어진 세계의 축에 의해 데카르트좌표계로서 세계를 표현한다.
 
 
  
정점(Vertex)
 
2D그래픽이 x,y 좌표에 어떠한 한점을 출력함으로써 화면에 그림을 그리듯이 3D그래픽 또한 x,y,z좌표상에 한점을 찍을 수 있습니다. 이때 이 점을 Vertex(정점)이라 부릅니다. 이 정점은 말 그대로 좌표계내에서 어떠한 한 점이 있는 곳을 지정하게 됩니다. 정점을 벡터라고 표현할 수도 있는데, 벡터는 벡터의 정의에 따라 원점에서 한 정점을 향하는 방향성을 가진 벡터로 볼 수 있습니다.
정점 A에서 정점 B로 향하는 벡터를 C라고 정의할 때,
벡터 C = 정점 B - 정점 A 로 표현할 수 있습니다.
정점 A를 원점이라고 한다면, 벡터 C와 정점 B는 물리학적으로 의미는 다르지만, 수학적으로는 같습니다. 그렇기 때문에 3D프로그래밍에서 정점은 일반적으로 벡터로 보고 계산을 하게 됩니다. 벡터의 합성등은 다른 여러 참고서적이나 정석등을 참고하면 자세히 알 수 있을 것입니다.
 
 
벡터의 내적( Dot product )
 
벡터의 내적은 Dot proguct라고도 하는데, 벡터 u와 벡터 v의 내적은
u * v = |u| times |v| times cos(theta)  입니다.
즉, 결과값은 Scalar로 정의됩니다. 여기서 theta 는 두벡터간의 사이각을 나타내는 것은 이미 아실 것입니다. 만약 u와 v가 unit vector 즉 크기가 1인 벡터라면 두 벡터사이의 각을 알아낼수 있습니다. 내적의 또다른 의미로는 벡터u의 벡터v에 대한 길이 즉, 벡터 u를 벡터 v위에 정사형을 그렸을때의 길이를 나타냅니다. 이것은 충돌등에서 많이 쓰이는 내적의 성질 중 하나입니다.
 
 
벡터의 외적 ( Cross product )
 
내적이 결과값이 Scalar인데 반해 외적의 결과값은 벡터입니다. 외적의 계산은 내적에 비해 조금 복잡합니다.
u times v = bmatrix { {u_y v_z - u_z v_y}#  {u_z v_x - u_x v_z}# {u_x v_y - u_y v_x}}  
로 나타낼수 있습니다. 외적의 성질은 외적의 결과벡터는 u와 v에 수직을 이루는 벡터란 성질입니다. 즉, 평면상에 세점을 알 때 두 벡터를 구하여 외적을 구한다면, 평면의 Normal벡터를 구할 수 있고, 이것은 위에 설명한 평면의 방정식에 대입할 수 있는 값이 됩니다. 외적은 벡터값을 결과값으로 가지기 때문에 치환법칙을 적용시킬 수 없습니다. 즉 u cross v와 v cross u 는 u,v가 속한 평면을 기준으로 mirror인 벡터가 될 것입니다.
 
 
행렬 (Matrix)
 
화면상에 나타날 정점들을 이동또는 축방향으로 회전을 시킨다고 할때, 이것을 연산하는 것은 매우 벅찬 일입니다.
만약 정점하나를 x,y,z축방향으로 각각 10.0만큼 이동시킨후, x축방향으로 0.4Radian 회전시킨후 y축방향으로 -0.5Radian 회전시킨다고 할때, 이러한 경우에 따른 모든 연산을 정점마다 해줄수는 없다. 일반적으로 여러개의 수식이 있을 때 이것을 해석하는 방법은 행렬을 많이 사용하는데, 행렬의 성질에 때문에 가장 많이 사용 되는 곳이 역행렬을 이용해 연립방정식의 해를 구하는 방법입니다. 행렬의 곱은 두 수식을 합칠수 있습니다. 즉, 위와 같은 경우라면 x,y,z축으로 10.0식 이동시킨 수식을 행렬로 만들고 이것을 x축방향으로 0.4Radian 회전시킨 수식으로 만든 행렬과 곱합니다. 이값은 행렬로 나오며 이 행렬값에 y축으로 -0.5Radian 회전시킨 행렬을 곱하면 원하는 세가지 수식이 합쳐진 완성된 수식이 생기게 됩니다. 이 행렬에 정점을 곱하게 되면 원하는 결과을 얻게 되는 것입니다. 보통 회전만을 위해서는 3X3행렬이 사용되고 이동까지 수식에 포함시키기 위해서는 4X4행렬을 사용하게 됩니다.
 
 
다각형(Polygon)
 
정점이 세개가 모이면 도형을 그릴 수 있게 됩니다. 세개의 정점으로 이루어진 도형은 도형의 최소단위인 삼각형입니다.(모든 도형은 삼각형으로 나눌 수 있다.) 폴리곤이라함은 삼각형이상의 여러점으로 이루어진 도형을 의미합니다. 4각형, 5각형, 8각형등이 모두 다각형의 범주안에 들어가게 됩니다. 일반적으로 다각형보다는 이 다각형을 최소단위로 쪼갠 삼각형을 많이 사용하게 됩니다.
 
 
평면(Face)
 
다각형을 끝없이 확장한다면, 넓은 평면이 될 수 있을 것 입니다. 이 때 이 평면은 공간을 분할하게 됩니다. 선분이 2D공간을 분할 하듯이 3D에서는 평면이 3D공간을 분할하게 됩니다. 여러분이 만약 3D에 대한 공부를 조금 한다면, 이 평면의 공간적 해석을 알아야 합니다. 공간적 해석이라고 결코 어려운 것이 아닙니다.
2차원에서 직선은 직선의 방적식으로 해석할 수 있습니다. 이 직선의 방정식에 의해 많은 것들이 결정될 수 있는 데, 임의의 점에서 직선까지의 최단 거리를 계산한다거나, 임의의  x 위치에서 y값을 찾아내는 등의 작업이 가능해 집니다.
마찬가지로 3차원에서 평면은 평면의 방정식으로 해석이 가능합니다. 즉, 한점과 직선과의 거리를 구하는 것 같은 것은 3차원에서도 가능하게 되는 것입니다. (그외에도 평면의 방정식은 교차판정이라든가, 평면의 Normal등을 알 수 있습니다.)
평면의 방정식은 ax + by + cz + d = 0 이다. 여기서 a,b,c는 각각 평면 임의의 세 점을 선분으로 이은 두 벡터의 cross product 의 x,y,z값이다.  d는 두벡터의 Dot product이다.
Cross Product의 정의에 의해 a,b,c로 이루어진 벡터의 Normal은 평면과 직교하는 벡터로써 평면이 바라보는 방향을 뜻하게 됩니다. 또한 이 평면의 방정식에 의해 임의의 한 점 과 평면과의 최단거리를 계산 할 수 있게 되는데, 이때 계산값이 0보다 크다면 Normal방향 즉, 평면의 앞에 있는 점이란 의미이고 0보다 작다면 평면의 뒤에 있다는 의미이며, 만약 계산값이 0이라면 평면위의 점이란 의미를 가지게 됩니다. 이러한 의미들은 추후에 좀 더 깊이 있는 공부를 할 때 매우 유용하게 사용 될 것입니다.
 
 
 
매쉬(Mesh)
 
매쉬는 공간상의 어떠한 물체를 나타내는 단위를 말합니다. 매쉬는 보통 3D 모델링프로그램에서 많이 쓰이는 용어로써. 매쉬는 하나의 정점이 될수도 있고, 하나의 삼각형이 될수도 있으며, 입체적인 모델이 될수도, 그리고 하나의 완전한 물체가 될 수 도 있습니다.
보통은 다각형들이 모여서 만든 하나의 입체적인 도형 또는 형체로 이해하는 것이 좋습니다. 매쉬는 매쉬끼리 종속관계에 의해 연결된다. 매쉬의 종속관계는 매우 복잡하며, 이 종속관계는 애니메이션부분에서 많이 참조하게 됩니다.
 
 
 
좌표계
 
좌표계는 공간상에 어떠한 점이 있을 때 이것을 정확히 지정하고자 만들어 진것 입니다. 일반적으로 데카르트 좌표계를 사용하게 되는데, 이것은 공간상의 임의의 한 점을 원점(0,0,0)으로 하고 나머지 공간을 표현하는 것입니다. 즉, 공간상의 모든 점은 아까 정의한 원점에 대한 상대적인 위치로 표현하게 됩니다. 원점의 좌표가 (0,0,0) 이므로 원점과의 x축, y축, z축 거리가 해당 점의 데카르트 좌표계에서의 좌표입니다. 3D 프로그래밍에서 사용하는 대표적인 좌표계는 두가지가 있습니다. 바로 오른손좌표계와 왼손좌표계입니다.
왼손 좌표계를 사용하는 대표적인 3D Api는 D3D이고,  Open-GL은 오른손 좌표계를 사용합니다. (하지만, D3D에서 오른손좌표계를 사용하도록 할 수도 있습니다.)
 
 
 
왼손, 오른손 좌표계라함은 x,y,z좌표가 증가하는 방향을 제시하는 것입니다. 즉, 왼손좌표계를 본다면, 위 그림과 같이 왼손엄지를 z축으로 하는 좌표계를 그릴 수 있을 것입니다.
왼손좌표계와 오른손좌표계는 보는 바와같이 x,y평면을 기준으로 대칭(mirror)인 것을 알 수 있습니다.
 
 
변환행렬(Matrix)
 
2D인 모니터에 3D의 다각형을 표시하기 위해서는 3차원의 각점을 관찰자의 시점에 2D로 투영시켜야 합니다. 그렇기 때문에, 3D에서는 투영행렬(Projection Matrix) 과 관측행렬(View Matrix)가 필요하게 됩니다.
관측행렬은 바로 관측자의 눈, 카메라를 의미합니다. 투영행렬을 3차원에 있는 한점을 관측행렬의 도움을 받아 2차원으로 변환시켜주는 역할을 하는 행렬입니다.
3D는 관측자, 오브젝트를 가짐으로써 매우 유용한 효과를 만들어 낼 수 있는데, 이것이 영화 매트릭스등에서 나오는 효과 같은 것입니다. 화면의 오브젝트를 멈춰놓고 관측자(카메라)만 오브젝트 주위를 회전함으로써 얻는 효과인데, 실제로 게임 맥스페인에서 사용되었습니다.
 
 
재질(Material)
 
어떠한 물체를 화면에 표시할때는 물체의 재질을 표현해야 할때가 있습니다. 이것을 3D 아티스트들은 질감 표현이라고 합니다. 재질은 각각 Diffuse, Ambient, Specular값에 의해 결정됩니다.
3D로 만들어진 도형인 구(Sphere)를 화면에 표시할 때, 빨간 구가 될수도 있고, 파란 구가 될수도 있습니다. 이것을 결정하는 것이 Diffuse값입니다. 파란구의 어두운 그림자는 빨간색일 수도 있습니다. 이것을 결정하는 것은 Ambient값입니다. 또하나, 파란구의 가장 밝은 반사광은 흰색이라고 지정할 수 있습니다. 이때 반사광은 Specular값에 의해 결정됩니다. 각각의 값은 r,g,b 값으로 구성되어 있습니다.
일상적인 물체의 재질이 겉 표면의 반사도와 방사광 그리고, 가시광선의 색깔이라고 할 때, 3D모델 자체도 재질을 가져야 하지만, 재질에 영향을 주는 있는 광선 자체가 재질을 가져야 한다. 그래서 이 재질의 세 가지 값은 라이트에도 쓰이게 됩니다. 즉, 파란색의 물체에 노란색 빛이 가해지면 녹색이 되는 등의 효과가 만들어지게 됩니다.
물체의 재질에는 한가지가 더 아주 중요한 요소가 포함되게 됩니다.
만약 물체에 어떠한 문양이 그려져 있다면, 단순히 재질만으로는 표현하기 힘들 것입니다. 그래서 나오는 것이 문양을 그림으로 그린 Texture란 것이 있습니다. Texture가 등장하면서 2D와 3D의 경계선은 점차로 무너져 가는듯이 보여지는데. Texture로 인해 3D에서 2D만큼이나 세밀한 그래픽을 표현 할 수 있게 된 것 입니다.

[출처] 3D란 무엇인가?|작성자 참치우동

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...