지우너
[DX12를 이용한 게임 프로그래밍 입문] Part1-Chap1 벡터대수(1) 본문
Chap1. 벡터 대수(1) 벡터 기초
아래 글은 Chap1 벡터대수의 1.1~1.2 내용을 담고 있습니다.
[목표]
1. 벡터의 기하학적 표현 방법과 수치적 표현 방법을 배운다.
2. 벡터에 대해 정의되는 연산들과 그 연산들의 기하학적 응용방법을 배운다.
3. DirectXMath 라이브러리의 벡터 관련 함수들과 클래스들에 익숙해진다.
벡터(vector)
크기와 방향을 모두 가진 수량(quantity)을 가리키는 말
ex) 힘(방향-세기), 변위(방향-거리), 속도(방향-빠르기)
어디에 쓰는데?
컴퓨터 그래픽과 충돌 검출, 물리 시뮬레이션에서 핵심적인 역할.
플레이어가 보는 방향, 표면에서 광선이 반사되는 방향 등 순수한 방향만 나타낼 때도 사용.
기하학적 표현 방법 vs 수치적 표현 방법
쉽게 말해 기하학적 표현은 우리가 보기 쉽게 그림으로 표현한 것이고, 수치적은 벡터를 계산하기 쉽도록 좌표계 원점에 위치시켜 $v=(x, y, z)$라고 표현한 것 같다. 부동소수점 x, y, z로 컴퓨터가 계산할 수 있게 한 것이 수치적 표현.
기하학적 표현 방법
벡터는 방향이 있는 선분(=지향선분, directed line segment)으로 표시
선분의 길이는 벡터의 크기를 나타내고, 선분 끝의 화살표는 벡터의 방향을 뜻한다.
벡터가 그려진 위치는 중요하지 않다. 위치가 바뀌어도 벡터를 구성하는 성분(방향, 크기)은 변하지 않기 때문이다.
그림 1.1 (a)의 u와 v는 위치만 다를 뿐 가리키는 방향과 크기가 같으므로 상등(equal)이다. (b)도 마찬가지이다. 두 개미가 같은 방향으로 10m 움직이기 때문에 u=v이다. 벡터는 단지 개미가 어느 방향으로 얼마나 나아가는지를 나타낸다.
수치적 표현 방법
컴퓨터는 벡터를 기하학적으로 다루지 못한다 → 수치적으로 표현할 방법이 필요
3차원 좌표계를 도입하고 모든 벡터의 꼬리가 좌표계의 원점과 일치하도록 이동하는 것.
(2차원 그래픽을 다룰 때는 그냥 2차원 좌표계를 사용하면 됨)
하나의 벡터를 머리(화살표 끝)의 좌표로 규정할 수 있으며, $v=(x, y, z)$로 표기할 수 있다.
이제 3차원 벡터를 컴퓨터 프로그램 안에서 부동소수점(float, double) 3개로 표현할 수 있다!
같은 벡터라도 기준계(=공간, 좌표계)에따라 좌표가 다르다.
물의 끓는 점은 섭씨 100°/화씨 212°이다. 물의 물리적 온도는 같아도 쓰는 단위에 따라 100, 212 이렇게 달라짐.
우리가 섭씨→화씨 와 그 반대의 변환을 할 수 있는 것처럼 한 좌표계에서 다른 좌표계로 변환하는 방법도 알아야 한다.
또한, 우리가 어떤 벡터를 좌표로 규정하거나 식별할 때 이는 항상 어떤 기준계에 상대적인 수치임을 기억해야 한다.
Direct3D는 왼손잡이 좌표계를 사용한다!! (OpenGL은 오른손 좌표계를 사용)
벡터 연산
$u=(u_x, u_y, u_z)$이고 $v=(v_x, v_y, v_z)$에 대해서
- 상등: 각 대응성분이 상등이면 상등. 즉, $u_x=v_x,\,u_y=v_y,\,u_z=v_z$일 때만 $u=v$이다.
- 덧셈: 성분별로 더하기. 즉, $u+v = (u_x+v_x,\,u_y+v_y,\,u_z+v_z)$
- 벡터에 스칼라 곱하기: 벡터의 각 성분에 스칼라값을 곱한 벡터가 나옴. $ku=(ku_x,ku_y, ku_z)$ 이를 스칼라 곱셈이라고 함
- 스칼라(scalar): 크기만 있는 수량. 우리가 일상적으로 쓰는 수들이 여기에 속한다고 생각하면 된다.
- 뺄셈: 성분별로 빼기. $u-v\,=\,u+(-1*v)\,=\,u+(-v)\,=\,(u_x-v_x,\,u_y-v_y,\,u_z-v_z) $
벡터 연산의 기하학적 표현
그림1.6(a) 벡터 부정과 스칼라 곱셈의 기하학적 해석 $v=(2, 1),\,-\frac{1}{2}v$
- $-\frac{1}{2}v=(-1,\,\frac{1}{2})$
- $-\frac{1}{2}v$는 방향이 $v$의 반대이고, 길이가 $v$의 $\frac{1}{2}$이다.
- 기하학적으로 한 벡터의 부정(negation, 부호를 반대로 하는 것)은 그 벡터의 방향을 "뒤집는" 것
- 스칼라 곱셈은 벡터의 길이(크기)를 확대, 축소하는 것
그림1.6(b) 벡터 덧셈의 기하학적 해석 $u=(2, \frac{1}{2}),\,v=(1,2)$
- $u+v=(3,\frac{5}{2})$
- u의 꼬리가 v의 머리와 일치하도록 이동했을때, v의 꼬리에서 이동 한 u의 머리를 가리키는 벡터가 두 벡터의 합(그림 1.6(b)의 빨간색 화살표)
- v의 꼬리가 u의 머리와 일치하도록 이동해도 동일한 결과가 나온다.(그림 1.6(b)의 파란색 화살표)
- 같은 방향의 힘을 더하면 그 방향으로 더 강한 알짜힘(더 긴 벡터)이 되고, 다른 방향의 힘을 더하면 더 약한 알짜 힘(더 짧은 벡터)이 된다(그림1.7)
그림 1.6(c) 벡터 뺄셈의 기하학적 해석 $u=(2, \frac{1}{2}),\,v=(1,2)$
- $v-u=(-1,\,\frac{3}{2})$
- $v-u$는 u의 머리에서 v의 머리로 가는 벡터
- u와 v를 점으로 해석한다면 점 u에서 점 v로 가는 벡터. 쉽게 말해 u가 v를 바라보는 방향
- u와 v를 점으로 간주하면 v-u의 길이가 u에서 v까지의 거리
- 그래픽에서는 한 점에서 다른 점을 가리키는 벡터를 구해야 하는 경우가 많다.
벡터의 크기와 단위벡터
벡터의 크기 구하기
기하학적으로 한 벡터의 크기는 해당 지향선분(=방향이 있는 선분)의 크기.
이중 수직선으로 표기 벡터 $v$의 크기는||$v$||
3차원 벡터의 크기는 그림1.8에서 알 수 있듯, 피타고라스의 정리를 2번 적용해서 계산할 수 있다.
- 밑변이 x이고 높이가 z인 삼각형의 빗변 a의 길이 $a=\sqrt{x^2+z^2}$
- 밑변이 a이고 높이가 y인 삼각형의 빗변 ||$u$||$= \sqrt{y^2+a^2}$
- $||u|| = \sqrt{y^2+(\sqrt{x^2+z^2})^2}$ (a에 $\sqrt{x^2+z^2}$ 대입한 식)
- $||u|| =\sqrt{x^2+y^2+z^2}$
단위벡터 만들기
벡터를 방향만 나타내는 용도로 사용하면, 벡터의 길이가 중요하지 않다.이런 '방향 전용 벡터'의 크기는 1(단위 길이라고 함)로 맞춰두면 편하다.
- 단위벡터(unit vector): 크기가 1인 벡터
- 정규화(nomalization): 임의의 벡터를 단위벡터로 만드는 것. 벡터의 각 성분을 벡터의 크기로 나누면 된다.
- $\hat{u}$는 단위벡터라는 의미
- $\hat{u}=\frac{u}{||u||}=\left(\frac{x}{||u||},\,\frac{y}{||u||},\,\frac{z}{||u||}\right)$
$\hat{u}$가 진짜 단위 벡터인지 길이를 계산해보자.
$||\hat{u}|| = \sqrt{\frac{x^2}{||u||^2} + \frac{y^2}{||u||^2}+\frac{z^2}{||u||^2}}$
분모가 전부 $||u||^2$이므로 $||\hat{u}||=\sqrt{\frac{x^2+y^2+z^2}{||u||^2}}$이다. ($\frac{2}{5}+\frac{2}{5}+\frac{1}{5} = \frac{2+2+1}{5}$을 생각하면 쉽다.)
제곱근을 분모 분자에 나눠도 결과는 같으므로 $||\hat{u}||=\frac{\sqrt{x^2+y^2+z^2}}{\sqrt{||u||^2}}$
위에서 ||$u$|| = $\sqrt{x^2+y^2+z^2}$라고 했으므로 $||\hat{u}||=\frac{||u||}{\sqrt{||u||^2}} = \frac{||u||}{{||u||}}=1$
따라서 $\hat{u}$는 단위벡터임이 증명됐다!(길이를 구했는데 1이 나왔으므로)
'Programming > DirectX' 카테고리의 다른 글
[DX12를 이용한 게임 프로그래밍 입문] Part1-Chap1 벡터대수(2) 내적 (0) | 2024.06.01 |
---|