이 글은 raytracer 시리즈입니다.
이전 글에서 벡터와 행렬에 대해 간단히 알아봤다. 이번 글에서 조금 더 자세히 알아보자.
목차
벡터
벡터는 크기와 방향을 가진 양으로, 힘, 속도, 가속도 같은 방향성을 가진 양을 나타낸다.
벡터는 수들의 목록(배열)으로 표현될 수 있으며, 갹 숫자들은 그 벡터의 성분, 원소이다.
벡터의 덧셈, 뺄셈
벡터의 덧셈은 단순히 각 원소를 더한 것으로 정의된다.
a+b=[ax+bxay+byaz+bz]
뺄셈도 마찬가지로 단순히 각 원소를 뺀 것으로 정의된다.
a−b=[ax−bxay−byaz−bz]
벡터의 스칼라 곱
벡터의 스칼라 곱은 각 원소에 스칼라를 곱한 것으로 정의된다.
vk=[vxkvykvzk]
벡터는 값이 여러개일 수 있다. 예를 들어 여기서는 3개. 스칼라란 값이 1개인 것을 말한다.
벡터의 내적
벡터의 내적은 두 벡터 간의 스칼라 곱으로, 두 벡터의 각 원소를 곱한 것을 모두 더해서 스칼라 값을 얻는 연산이다.
내적은 두 벡터의 각도와 관련이 있으며, 두 벡터가 서로 직각인 경우 내적의 결과는 0이 된다.
a⋅b=axbx+ayby+azbz
벡터의 외적
외적은 3차원과 7차원에서만 정의되는 특별한 연산이다. 두 벡터에 수직인 벡터를 얻을 수 있다.
a×b=[aybz−azbyazbx−axbzaxby−aybx]
벡터의 길이
길이는 피타고라스의 정리에 따라 각 원소의 제곱을 모두 더한 것의 제곱근으로 구할 수 있다.
∥v∥=vx2+vy2+vz2
벡터의 정규화
벡터를 그 벡터의 길이로 나눈, 길이가 1인 벡터를 단위 벡터라고 한다.
v^=∥v∥v=[∥v∥vx∥v∥vy∥v∥vz]
단위 벡터의 방향은 원본 벡터와 동일하다. 방향 벡터를 구하는 데 사용된다.
행렬
행렬은 숫자들이 행과 열로 이루어진 직사각형 배열(2차원 배열)이다.
행렬의 곱셈
행렬의 곱 AB의 각 원소는 A의 해당 행을 이루는 벡터와 B의 해당 행을 이루는 벡터의 내적이 된다.
A×B 행렬은 B×C 행렬과 곱할 수 있으며, 결과는 A×C 행렬이 된다.
2×3 행렬 A와 3×4 행렬 B를 곱하면 결과는 2×4 행렬이 된다.
예를 들어 A와 B가 이렇게 된다면,
- A=[a11a21a12a22a13a23]
- B=b11b21b31b12b22b32b13b23b33b14b24b34
결과 행렬 AB는 이렇게 계산된다.
AB=[a11b11+a12b21+a13b31a21b11+a22b21+a23b31a11b12+a12b22+a13b32a21b12+a22b22+a23b32a11b13+a12b23+a13b33a21b13+a22b23+a23b33a11b14+a12b24+a13b34a21b14+a22b24+a23b34]
A×B 행렬과 B×C 행렬을 곱한 결과는 A×C 행렬이 된다고 했는데,
A와 C가 다르다면 B×C 행렬은 A×B 행렬과 곱할 수 없다.
즉, 행렬 A와 B가 있을 때, 그 둘을 곱한 AB와 BA가 다를 수 있다.
그러므로 행렬은 곱하는 순서가 중요하다.
크기 조절, 회전, 이동 등 다양한 변환을 벡터에 행렬을 곱함으로써 적용할 수 있다.
여러가지 변환을 적용한다면, 적용하는 순서에 따라 다른 결과가 나올 수 있는데, 이는