Search
moon
sun
📦

(2) 벡터에 대한 이해!

분류
벡터연산
visible
과제
miniRT
생성일
2021/04/07 06:04
작성자
nj_blog
최종 편집일
2021/04/11 07:30
Property
🎁 minirt 뽀개기!

벡터 이해하기

Raytracing one weekend 문서를 보다보면 반복문을 활용해 ppm이미지를 만들고 vector클래스를 만들더니 갑자기 벡터를 활용한 코드를 만든다. 심지어 문서에 나오는 코드는 C++로 작성되어있다! 우리는 이것을 C로 바꾸어야 한다.
벡터에 대한 개념이 없으면 이전에 나왔던 클래스들도 이해하기 어렵고 해당 멤버함수들을 대체 왜 만들어야 하는지 어렵지만 차근차근 하나씩 배워가면 이후 연산들도 어렵지 않다!

벡터란?

minirt과제를 진행하려면 벡터에 대해 이해하고 넘어가는 것이 필수이다. 우선 코드를 잡기 전에, 벡터에 대해 알아보자!
💡
벡터란? 크기와 방향을 함께 가지는 성분
선형대수에서 벡터에 대해 이야기 할때, 원점에 꼬리를 둔 화살표를 하나 생각하는 것이 좋다. 아래의 그림을 살펴보자.
1차원 좌표계인 위의 그림을 보면 t = 0 인 좌표에서 t = 1인 좌표를 가리키는 크기가 1인 벡터가 있다. 우리는 여기서 벡터를 시작지점 + 크기 * 방향로 표현할 수 있다.
즉 이 그림의 벡터 = A + 1 * b 인 것이다. 이 식을 일반화 하게 되면 아래와 같다.
P(t)=A+tbP(t) = A + tb

벡터의 표현

하지만 우리가 사용할 좌표계에서는 크기와 방향(즉, t와 b)를 바로 알기 어렵다. 우리는 좌표계를 활용해 벡터의 성분을 분해한 표기법을 사용할 것이다. 예를들면 아래의 벡터 A는 A(x, y) 로 표기할 수 있다.
혹은 아래 사진처럼 변수 위에 → 를 달아서 표현하기도 한다.
기하학적으로 벡터의 크기는 방향을 가진 선분의 길이이다. 벡터의 성분이 주어졌다고 할 때, 우리는 피타고라스 정리를 활용해 벡터의 크기를 알 수 있다! (|A| 는 벡터 A의 크기를 나타낸다)
A=x2+y2|A| = \sqrt{x^2 + y^2}
minirt과제를 진행한다면 3차원 벡터를 표현해야한다. 3차원 벡터도 위의 방식을 사용하면 어렵지 않게 표현할 수 있다!
A=x2+y2+z2|A| = \sqrt{x^2 + y^2 + z^2}

같은 벡터

시작점, 종점과 상관 없이 벡터의 길이와 방향이 모두 같으면 같은 벡터이다!
벡터에게 위치는 중요하지 않다!

프로그래밍에서의 벡터

벡터는 <기하학>에서의 개념이지만 <대수학>영역인 프로그래밍에서 어떻게 쓰이는지를 잘 파악해야 한다.
Vector2(x, y), Vector3(x, y, z) 으로 나타낼 수 있다.
x, y, z 는 각각 벡터의 성분이 된다.
1.
위치 좌표로 쓰임 (절대좌표)
사실 위치 좌표는 스칼라로 보이더라도 이 또한 원점을 시작점으로, 해당 위치를 종점으로 하여 화살표로 이어진 벡터라고 해석할 수 있다.
위치 좌표로서의 Vector2(2, 4)는 Vector2(0, 0) 원점을 시작점으로 했을 때  Vector2(2, 4)로 향하는 벡터라고도 할 수 있다.
2.
벡터로 쓰임 (상대좌표)
어떤 방향으로 얼마만큼의 크기 만큼 변화했는지의 정도

영벡터 (Zero Vector)

영벡터는 모든 성분이 0인 벡터를 말한다! 즉 좌표계의 원점이다. 굵은 0으로 표현하기도 한다.
영벡터는 방향이 없다!
0 = (0, 0, 0)

역벡터 (Inverse Vector)

크기는 같고 방향만 정반대인 벡터! 특정 벡터의 시작점과 종점이 바뀐 것을 의미한다.
A 벡터의 역벡터는 -A벡터이다!
A + (-A) = 0

단위벡터 (Unit Vector) = 방향 벡터

단위벡터는 크기가 1인 벡터이다.
단위 벡터는 크기는 1이지만 방향을 가지고 있으므로, 여기에 값을 곱해주면 방향은 같지만 크기가 다른 벡터를 마음대로 만들 수 있다. 혹은 크기는 무시하고 방향만 나타내기 위해서 사용한다.
모든 벡터는 정규화(normalize) 과정을 거쳐 단위 벡터로 만들 수 있다. 벡터 U를 (x, y)라고 했을 때, 정규화를 하는 식은 아래와 같다.
U=(xx2+y2,y/x2+y2)U = ({x\over\sqrt{x^2 + y^2}}, {y\over / \sqrt{x^2 + y^2}})
위 식은 벡터의 각 성분에 벡터의 크기를 나눠준 것이다!

법선벡터 (Normal Vector)

법선벡터는 어떤 표면(평면)에 수직인 뱡항으로 뻗어나가는 벡터이다.
❗컴퓨터 그래픽스에서는 모든 Normal Vector(법선벡터)Unit Vector(단위벡터)로 표현한다. 따라서 아래의 식을 활용해 구할 수 있다. (단위벡터로 표현하기 위해서는 벡터의 크기만큼 나눠주어야 한다.)
(V1×V2)V12+V22 (V1 \times V2) \over \sqrt{|V1|^2 + |V2|^2 }
위에서 나오는 벡터 x 벡터 연산은 벡터의 외적인데 📦(3) 벡터의 연산! 페이지에서 알 수 있다.

법선벡터는 왜 필요한 걸까?

법선 벡터를 사용함으로써 울퉁불퉁한 곡면을 부드럽게 표현, 완벽한 조명 적용 가능 하다고 한다. 또한 우리가 카메라로 특정 물체를 보고싶을 때, 물체의 한 면이 카메라의 시야에 들어오는지 법선벡터를 활용해 알 수 있다!
법선 벡터를 사용하는 예제를 조금 더 보고싶다면 아래 페이지를 참고해보자!
그래픽스 모델링에서 사용하는 법선 벡터에 대해 궁금하다면 아래 페이지를 참고해보자!

Prev

Reference