* Computer Graphics Programming in OpenGL with C++ 책을 참고하였습니다.
* 책을 번역한 것이 아닌, 제가 독학 후 책을 참고하여 설명하는 게시물입니다. 따라서 책에 없는 부연 설명이 있기도 하며, 의역 또는 오역, 오개념이 있을 수 있습니다. 피드백은 댓글을 남겨주세요.
* 영어 용어를 최대한 한국어로 번역하지 않습니다. 처음부터 코드에서 사용되는, 또는 원서나 인터넷에서 사용되는 보편적 용어를 사용하여 개념을 잡는 것을 추천드립니다.
책의 챕터 3은 그래픽에 유용하게 사용될 수학적 기초를 소개합니다. 선형대수학의 기본 지식들을 포함하여 그래픽스 프로그램에서 자주 사용하는 공식들이 대부분이죠. 저는 이번 게시글에서 아주 기본적인 수학 부분은 생략하고, 새로운 개념과 그래픽스 세계관의 시선으로 접근한 수학적 원리를 소개하도록 하겠습니다.
* 선형대수학을 기하학적, 또는 프로그래밍적으로 배우고 싶으신 분들은 Youtube에서 1blue3brown의 시리즈를 보실 것을 추천드립니다. 쉽고 신박하게 설명해주십니다.
https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
3D 좌표계
3D 좌표계는 보통 두 종류로 나눠집니다. 오른손 좌표계(right-handed)와 왼손 좌표계(left-handed)죠. 이 둘은 검지, 중지 손가락을 X, Y 축으로 생각했을 때, Z축에 해당하는 엄지 손가락의 방향이 오른손의 방향을 따르는지, 왼손을 따르는지에 따라 결정됩니다.
OpenGL은 오른손 좌표계 기준입니다. Direct X는 왼손 좌표계 기준이니 참고하세요.
점 (Points)
3D 공간에 있는 점은 X, Y, Z 값으로 구성됩니다. (x, y, z) 이런 식으로 표기되죠. OpenGL 프로그램에서 점의 좌표를 표기할 때는 주로 homogeneous 표기법에 따라 vec4 좌표, (x, y, z, w)로 표기합니다.
행렬 (Matrices)
그래픽스에서 사용되는 행렬은 보통 4x4 행렬입니다. mat4 형을 사용하여 쓸 수 있습니다.
GLM에서 단위 행렬은 glm::mat4 m(1.0f)로 사용할 수 있고, 전치 행렬은 glm::transpose(mat4)로 사용할 수 있습니다. GLSL에서도 transpose(mat4)를 통해 전치 행렬 계산을 할 수 있습니다.
행렬의 덧셈은 간단합니다. 같은 행, 같은 열끼리 더해주면 됩니다.
GLSL에서 mat4형에 대한 + 연산자는 행렬의 덧셈을 수행하도록 오버로드 되어 있습니다.
3D 그래픽에서 가장 중요한 연산이라고도 할 수 있는 행렬의 곱셈은 주로 right-to-left (오른쪽에서 왼쪽으로) 곱셈으로 계산합니다. 점과 행렬의 곱셈도 마찬가지입니다.
위에서는 점(X,Y,Z)를 1열 행렬로 표기합니다. GLSL과 GLM 둘 다 * 연산자를 사용하여 점과 행렬을 곱할 수 있습니다. 4x4 매트릭스와 다른 4x4 매트릭스는 다음과 같이 곱합니다.
행렬 곱셈을 종종 concatenation(연쇄)라고 합니다. 행렬 곱셈을 결합할 수 있기 때문인데요. 예시를 살펴봅시다.
새로운 점 = 행렬_1 * (행렬_2 * (행렬_3 * 점))
위의 변환식을 이해해보면, 점에 행렬_3, 행렬_2, 행렬_1을 차례로 곱하여 새로운 점을 계산합니다. 연쇄의 속성은 위의 변환식과 다음 변환 식이 동일한 값을 계산해냄을 보장합니다.
새로운 점 = (행렬_1 * 행렬_2 * 행렬_3) * 점
이 변환 행렬 세 가지를 하나의 행렬 행렬_C로 나타낸다면 다시 다음과 같이 나타낼 수 있습니다.
새로운 점 = 행렬_C * 점
이를 통해 우리는 장면의 모든 지점에 동일한 행렬 변환을 적용해야 할 때, 계산을 간단하게 할 수 있게 됩니다.
역행렬(행렬 M의 역행렬은 M^-1)은 다음과 같은 속성을 가집니다.
역행렬의 계산은 계산 비용이 큽니다. 다행히도 3D 그래픽에서 역행렬의 계산이 필요한 경우는 드뭅니다. GLSL과 GLM 둘 다 mat4.inverse() 함수를 통해 역행렬 계산을 지원하긴 합니다.
다음 포스트에서는 위의 개념들을 3D 그래픽 프로그램에서 어떻게 활용하는지 더 자세히 알아보도록 하겠습니다.
'College Study > OpenGL' 카테고리의 다른 글
[그래픽스] 기초 수학 (3) - 벡터 (0) | 2020.10.15 |
---|---|
[그래픽스] 기초 수학 (2) - Transformation Matrices (변환 행렬) (0) | 2020.10.15 |
[그래픽스] 정점으로 개체 그리기, 애니메이팅, 모듈화 (0) | 2020.06.09 |
[그래픽스] 파일에서 GLSL 소스코드 읽기 (0) | 2020.06.08 |
[그래픽스] OpenGL과 GLSL의 오류 검출 (0) | 2020.06.08 |
댓글