여는 글
[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]은 고려대학교 한정현 교수님께서 K-MOOC에 무료강의를 올려주시기로 유명한 책이죠. 저도 교수님의 강의를 보면서 도움을 받고자 책을 구입했습니다.
사실 전공이 아예 다르다보니, 3D 그래픽을 배울때 선형대수학을 얼마나 배워야하는지 감이 안왔는데요. 교수님께서 강의에서 말씀주시기를 3D에서 사용되는 선형대수학은 제한적이라고 하시더군요.
사실 이런 부분을 몰랐다보니 블렌더를 가르쳐주는 블로그에서 나온 토폴로지라는 용어가 위상수학을 말하는 줄 알고, 선형대수학과 위상수학을 언제 다 보고 있나 고민도 많이 했네요. (결론은 위상수학이 아니라, 메쉬 표면의 폴리곤 배열을 블렌더에서 일컫는 용어였습니다. 토폴로지를 잘 해야 한다는 건 모델링을 여러번 해보면서 각 모양에 대한 접근법을 쌓으라는 의미였네요.)
생각해보면... 디자이너 분들도 사용할 수 있도록 통합된 툴을 만들기 위해 제작된게 최근의 언리얼엔진인만큼 3D 그래픽을 배우기 위해서 수학을 처음부터 끝까지 다 살펴야 한다면 비효율적이지 않을수가 없을 것 같습니다.
물론 프로그래밍의 깊은 단계까지 가려면 좀 더 넉넉히 지식을 습득해야겠죠. 하지만, 엔진의 원리를 가볍게 이해하는 정도라면 굳이 선형대수학을 하나의 강의로서 수강할 정도의 지식은 필요치 않은 듯하니, 혹시라도 같은 고민이 있으신 분들께서는 참고하시면 좋겠습니다.
다행히 대부분의 내용들이 고등학교때 배웠던 행렬/기하/벡터의 내용에서 크게 벗어나지는 않는 것 같네요. 기하와 벡터 과목을 잘 배워두셨다면 가볍게 읽고 넘어가실 수 있을 것 같습니다.
행렬
정사각행렬(square matrix)
행렬은 행(row / 가로방향)과 열(column / 세로방향)로 구성됩니다. 이때 행과 열의 길이가 같다면, 이를 정사각행렬이라고 부릅니다.
단위행렬(identity matrix)
정사각행렬 중에서도 왼쪽 위에서 우측 아래 방향 대각선에 위치한 숫자들이 모두 1인 경우 단위행렬이라고 부릅니다. 어떤 행렬을 단위행렬과 곱하면 그 자신을 반환합니다. 즉, 행렬 A에 대해 AI = IA = A 입니다.
전치행렬(transpose)
어떤 행렬 A에 대하여, 행과 열을 온전히 바꿔놓으면 이를 A의 전치행렬이라고 부르며, 아래와 같이 우측 상단에 첨자로 T를 붙여 표기합니다.
역행렬(inverse)
어떤 정사각행렬 A와 정사각행렬 B에 대하여, 서로 곱했을 때 결과물이 단위행렬이 된다면, 즉 AB = I라면, B는 A의 역행렬이라고 부르며 아래와 같이 우측 상단에 -1 첨자를 붙여 표기합니다.
벡터
벡터(vector)
'크기와 방향을 가진 물리량'으로 보통 정의하지만, 쉽게 이해하자면 (2~3차원의) 좌표 + 방향성으로 보시면 됩니다.
행벡터(row vector) / 열벡터(column vector)
일반적으로 벡터를 표기할때는 2차원의 경우 (x, y), 3차원의 경우 (x, y, z)의 형태로 표기합니다. 이렇게 각 요소간 구분을 쉼표로 하고 가로로 길게 표기하는 방식은 행벡터라고 부릅니다.
반면 아래와 같이 세로로 표기한다면 열벡터라고 부릅니다.
열벡터를 누가 쓰겠냐 싶겠지만, 놀랍게도 OpenGL은 열벡터를 사용합니다. 반면 Direct3D는 행벡터를 사용합니다.
벡터의 정규화(normalization) / 단위벡터(unit vector)
벡터를 자기 자신의 크기로 나눠 길이 1인 벡터로 만드는 것을 벡터의 정규화라고 합니다. 이때 2차원 벡터의 크기는 아래와 같이 계산할 수 있습니다. 이렇게 정규화를 거친 벡터를 단위벡터라고 부릅니다.
좌표계와 기저
데카르트 좌표계(Cartesian coordiante system / 카테시안 코디네이트)
일반적으로 사용하는, XYZ로 표현하는 3차원 좌표계를 일컫는 표현입니다. 좌표계의 개념을 정의한 학자 데카르트의 이름을 따서 데카르트 좌표계라고 부릅니다. 참고로 영문표기의 '카테시안'은 데카르트의 라틴어 이름인 '카르테시우스'를 딴 명칭입니다.
기저(basis)
2차원 공간의 모든 벡터는 두 개의 벡터의 조합으로 표현이 가능한데요. 이러한 두 개의 벡터 e1, e2를 기저라고 부릅니다.
표준기저(standard basis)
이러한 기저들 중, x축, y축에 나란한 단위벡터로 구성된 기저를 표준 기저라고 부릅니다.
직교정규(orthornormal)
기저들이 서로 90도를 이루고 있다면(즉, 직교한다면) 이를 직교정규 성질을 갖는다고 부릅니다.
내적(스칼라곱)과 외적(벡터곱)
내적(dot product / inner product / scalar product)
아래와 같이 두 개의 행렬을 서로 곱해서 원소끼리 더한 값을 내적이라 부릅니다.
아울러 이러한 내적은 아래와 같이 cos∂의 값을 따르는데요.
a·b = ||a|| × ||b|| × cos∂
a와 b의 길이값은 음수가 될 수 없으므로 코사인 값의 부호를 따르게됩니다.
코사인의 특성상 -90~90도에서는 양수, 그 외에는 음수값을 갖게되는데요. 이에 따라 게임 내에서는 두 오브젝트가 바라보고 있는 방향이 서로 일치하는지를 확인하는데 사용됩니다.
바라보는 방향이 일치하고 있다면 그 숫자가 단위벡터를 기준으로 1에 가까워지고, 직교하면 0, 반대방향을 보면 -1에 가까워집니다.
또한 이러한 기능을 응용하며, 눈이 오는 환경에서 각 오브젝트마다 눈이 쌓인 효과를 낼 때 내적값이 특정 범위(가령, 0.95~1)인 경우에는 표면에 눈이 형성되도록 하는 등 범위 지정을 상당히 간편하게 수행할 수 있습니다.
외적(vector product)
벡터의 외적은 조금 계산이 복잡한데요. 3차원 벡터 A = (a, b, c)와 B = (x, y, z)의 외적은 아래와 같습니다.
A × B = (bz - cy, az - cx, ay - bx)
내적은 하나의 숫자로 결과를 보여주는 반면, 외적은 벡터곱이라는 이름대로 벡터값으로 나옵니다. 다만 그 길이는 아래와 같이 계산할 수 있습니다.
||A × B|| = ||A|| × ||B|| × sin∂
참고로 외적은 수식의 앞쪽에 있는 벡터가 어떤 벡터이냐에 따라 그 부호가 달라집니다. 즉, A × B와 B × A는 크기는 같을 지언정 방향은 정반대인 벡터를 보여줍니다.
이러한 원리를 이용하여 외적은 반대로 두 벡터에 대해, 한 벡터를 기준으로 나머지 한쪽이 좌, 우 중 어디에 위치해 있는지를 알려주는 값으로 사용됩니다.
직선 및 선형보간
매개변수 방정식
어떤 직선을 특점 점으로 2분할 할 때, 특정 변수t만 변경하면 그 위치를 특정할 수 있도록 짜여진 방정식을 매개변수 방정식 이라고 부릅니다. 매개변수 방정식은 아래와 같습니다.
p(t) = p₁ + t(p₂ - p₁)
이렇게 매개변수 방정식으로 만듦으로써 우리는 게임내에서 특정 수치(가중치)를 조정하는 슬라이더를 만들 수 있게됩니다. 매개변수 방정식 없이 처리하려면 우리는 입력된 값이 특정 선분상에 위치하는 점이 맞는지 매번 검증해야 할 겁니다.
우리는 매개변수 방정식을 통해 이러한 번거로움을 없애고 색상, 레이어 웨이트, 불투명도 등을 슬라이더로 간단히 조절이 가능해집니다.
선분(line segment) / 광선(ray) / 선형보간(linear interpolation)
위와 같이 매개변수 방정식을 만들 때, 양 끝 지점이 정해져있다면 이는 선분에 해당합니다. 반면 한쪽이라도 무한대로 트여있다면 광선이라고 부릅니다.
아울러, 매개변수 방정식을 변수를 중심으로 다시 정리하면 아래와 같이 쓸 수 있는데요.
p(t) = (1 - t)p₁ + tp₂
위 식에서 (1 - t)와 t를 p₁와 p₂에 대한 가중치로 보면, p(t)는 p₁와 p₂의 가중치 합이되며, 특히 t값이 0~1사이일 때 p(t)는 p₁와 p₂의 선형보간이라고 합니다.
언리얼엔진에서 머티리얼을 다룰 때 선형보간에 대해서 상당히 많이 접해보았던 기억이 나네요. 언리얼엔진의 블루프린트 노드 중 Lerp, FinterpTo가 이러한 보간기능을 구현하는 노드였습니다. 이렇게 선형보간과 변수, 두 텍스처 혹은 색상값등을 연결한 후 외부 에디터 화면으로 연동하여 슬라이더 형태로 오브젝트의 색상이나 관절움직임 등을 조절했던 기억이 나네요.
'컴퓨터 & 코딩 공부 > 컴퓨터 그래픽스 & 언리얼 엔진' 카테고리의 다른 글
컴퓨터 그래픽스 - (버텍스 셰이더)물체 축소/확대, 회전, 이동의 원리 (3) | 2024.10.09 |
---|---|
컴퓨터 그래픽스 - 모델링(폴리곤 메시, 정점(버텍스), 노멀(법선)의 관계) (0) | 2024.09.06 |
컴퓨터 그래픽스 - 언리얼 엔진 지형도구에서 각 셰이더의 역할 (0) | 2024.08.26 |
컴퓨터 그래픽스 - 그래픽 파이프라인(렌더링 파이프라인) 단계 정리 (0) | 2024.08.26 |
컴퓨터 그래픽스 - 기본지식 (1) | 2024.08.16 |