본문 바로가기
College Study/OpenGL

[그래픽스] 기초 수학 (3) - 벡터

by 2den 2020. 10. 15.
728x90

Computer Graphics Programming in OpenGL with C++ 책을 참고하였습니다.

* 책을 번역한 것이 아닌, 제가 독학 후 책을 참고하여 설명하는 게시물입니다. 따라서 책에 없는 부연 설명이 있기도 하며, 의역 또는 오역, 오개념이 있을 수 있습니다. 피드백은 댓글을 남겨주세요.

* 영어 용어를 최대한 한국어로 번역하지 않습니다. 처음부터 코드에서 사용되는, 또는 원서나 인터넷에서 사용되는 보편적 용어를 사용하여 개념을 잡는 것을 추천드립니다.

지난 포스트에 이어, 벡터의 기본 개념과 3D 응용 프로그램에서 벡터가 어떻게 활용되는지 간단하게 설명하도록 하겠습니다.

고등학교 이과 수학에서 등장하는 개념인 벡터는(요즘 교육과정은 어떤지 모르겠네요), magnititude(크기)와 direction(방향)을 동시에 갖는 것이 가장 핵십입니다. 어느 특정 위치에 고정된 값이 아닌, 크기가 같고 방향이 같다면 어느 위치에 있든 같은 벡터값이 되는 것이 특징입니다. 간단하게 책에 나온 그림을 보여드리고 넘어가도록 하겠습니다.

 

두 화살표는 같은 벡터값 V를 나타냅니다.

 

흔히 3D 그래픽에서는 정점(x, y, z 3차원의 좌표값을 갖는)을 벡터와 혼용하기도 합니다. 개념적 혼란을 방지하기 위해 정점 클래스와 벡터 클래스를 구분하여 사용하는 API도 있고, 사실상 컴퓨터가 계산하는 데에는 지장이 없기 때문에 벡터 클래스로 정점을 표시하는 API도 있습니다. 우리가 사용할 GLSL과 GLM은 둘을 전혀 구분하지 않습니다.

GLM과 GLSL에서 사용 가능한 연산은 다음과 같습니다.

 

덧셈과 뺄셈
정규화
내적
외적

또 다른 유용한 연산에는 magnitude(크기 구하기, GLSL과 GLM에서는 length() 메소드로 사용), reflection(반사), refraction(굴절) 등이 있습니다.

 

Dot Product (내적)

벡터의 내적부터 자세하게 살펴봅시다. 이 책 전반에 걸쳐, 내적을 사용할 일이 많습니다. 가장 중요하게 사용되는 부분은 두 벡터 사이의 각도를 찾아야 할 때 입니다.

 

두 벡터가 정규화가 된다면, 위와 같이 계산할 수 있습니다. θ각 자체보다 cos(θ)를 활용해야 할 때가 자주 있기 때문에, 오른쪽 두가지 식 모두 기억해 놓는 것이 좋습니다.

내적을 통해 다음과 같은 작업도 가능합니다:

- 벡터의 크기 찾기

- 두 벡터가 수직인지 판별하기

- 두 벡터가 평행한지 판별하기

- 두 벡터가 평행하고 다른 방향을 가르키는지 판별하기

- 두 벡터 사이의 각이 -90° ~ +90° 범위에 존재하는지 판별하기

- 면 S(a,b,c,d)와 점 P(x,y,z) 사이의 거리 구하기

 

Cross Product (외적)

벡터의 외적은 보통 두 벡터로 이루어진 평면에 수직인 벡터를 찾기 위해 사용됩니다. 동일 선상에 존재하지 않는 (non-collinear) 두 벡터는 항상 한 평면을 이룹니다.

 

위 그림은 오른손 좌표계를 따르고 있습니다. 이러한 외적 계산을 통한 법선벡터 찾기 연산은, 추후에 lighting(라이팅) 작업에 유용합니다. 아래와 같이 표면의 외부 법선을 계산하여 비춰지는 빛의 양을 계산할 것입니다.

 

다음 포스트에서는, 이어서 지금까지의 개념들을 종합하여 3D 응용프로그램의 scene(장면)을 계산하고 변환하는 방법을 알아보도록 하겠습니다. (정말 재미있으니 기대하셔도 좋습니다.)

728x90

댓글