Vector dot product(벡터의 내적)
앞전에는 벡터와 스칼라의 곱을 배웠습니다. 이번에는 두개의 벡터를 곱하는 방법에 대해서 알아 보겠습니다.
벡터의 곱셈은 두 타입의 벡터의 곱셈이 있습니다. 한개는 dot product(내적 inner product) 가 있습니다. 이번 섹션에서 다룰 예정입니다.
또 하나는 Cross Product(외적) 다음 섹션에서 다룰 예정입니다.
dot product는 비디오게임 어디에서든지 많이 사용됩니다. 그리고 그래픽스, 시뮬레이션, AI에서도 사용됩니다.
dot product 공식은 이 책에서 외워야할 몇개 안되는 공식중 하나 입니다.
첫번쨰로 이 공식은 외우기가 정말 쉽습니다. 여러분은 내적이 무엇을 하는지 이해한다면
그 공식을 외우는데는 시간문제입니다. 그리고 내적은 수 많은 연산과도 유기적인 관계를 이룹니다. 예를 들어 행렬의 곱셈, 신호 변환, 통계적인 상관관계, 푸리에 변환등
공식을 이해하면 이러한 관계가 더욱 명확해집니다.
단순 공식을 암기하는 것보다 더 중요한 것은 내적이 하는 일을 직관적으로 이해하는게 더 중요합니다.
C++, HLSL, Matlab, Maple 같은 언어를 사용할 경우 이미 해당 함수가 내장되어 있어 따로 내적공식을 타이핑할 필요가 없습니다. 또한 내적을 내적을 정의하는데는 특정 좌표계사용을 필요로 하지 않습니다.
“내적(dot product)”라는 이름은 표기법에 사용된 점 기호에서 유래되었습니다.
내적은 곱셈과 마찬가지로 기본 연산순서는 덧셈과 뺼셈보다 먼저 수행됩니다. 기본 곱셈연산을 할떄는 가운데 .(dot), 또는 x 기호를 생략하기도 하는데 벡터의 내적에서는 가운데 점(dot)을 생략하면 안됩니다.
두 벡터의 내적은 해당 성분의 곱의 합으로 계산하며 결과는 스칼라가 됩니다.
이는 시그마 기호로 바꿔서도 표현 가능합니다.
자주 사용하는 2D, 3D를 공식화 하면 다음과 같습니다.
사용 예시 :
자 이제 내적에 대해서 의논 해봅시다. 이건 우리에게 아주 큰 과제가 될것입니다.
일단 내적을 바라보는 다른 2가지 방법에 대해서 이야기 할것입니다.
2가지 방법은 결과적으로 동등합니다.
첫번쨰 내적을 설명하는 방법은 덜 일반적인 방법입니다. 하지만 실제로는 더 유용한 경우로 많이 사용 됩니다. 이 방법은 a벡터가 단위벡터이고 b벡터가 있을때 a내적b 의 값은 a의 평행산 선에 투영된 투영한 길이가 됩니다.
위그램에서 투영된 길이의 결과를 화살표로 그리기는 했지만 내적의 결과는 벡터가 아닌 스칼라라는 것을 잊지마세요.
우리가 처음으로 음수와 양수를 배울때 화살표의 방향으로 표현이 가능했습니다. (음수 : 좌,양수 :우)
해당 내적의 결과가 양수일떄, 음수일때, 0과 같을때에 따라서 우리는 다른걸 유추 할 수 있습니다.
결과적으로 내적의 부호는 두 벡터의 상대 방향에 대한 분류를 제공 할 수 있습니다. 내적의 결과는 a의 기호는 b가 어느 위치에 있는지를 알려줍니다. 예를들어 내 시야범위 (0~180도)안에 상대편이 있는지 없는지를 체크하는 경우를 활용 할수 있다. 내적의 결과가 양수라면 내 앞에 있는것이고
0보다 작다면 너 뒷편에 있는걸로 알수 있다.
또한 벡터 b에 k배 연산을 진행했을때 어떤일이 일어나는지 확인 해보자.
위 그림을 보면 벡터 b에 k배를 하게 되면 내적의 결과도 k배만큼 늘어나게 됩니다. 내적공식에 값을 대입해보면 아래와 같은 결과가 나오게 됩니다.
따라서 scaling은 내적의 각 요소값을 스케일링 시킵니다.
a,b 내적의 결과는 어떤 a이든지간에 a를 단위벡터로 만든후에 내적을 계산하면 b의 길이를 투영시킨 길이와 같습니다.
또한 ab 내적과 ba내적은 값이 같습니다.
또한 내적은 분배 법칙이 성립합니다.
분배법칙에 대한 설명을 그림으로 표현하면 아래 그림과 같이 나누어서 표현이 가능합니다.
또한 기본 좌표축에 x좌표만을 추출할때도 내적을 활용할 수 있습니다.
내적에 대한 두번째 해석으로 전환하기 전에 내적을 투영으로 사용하는 경우를 하나 더 보도록 하겠습니다.
^a 가 단위벡터이고 임의의 벡터 b가 있을때 b|| + bㅗ = b 로 표현이 가능합니다.
우리는 b|| 의 길이가 a^ . b와 같다는걸 알수 있었습니다.
b|| 를 투영시킨 길이에 단위벡터 ^a를 곱한 결과로 과정지으면 다음과 같은 식을 유도 할수 있습니다.
자 이제 두번째로 삼각함수에서의 내적을 정의하겠습니다.
이 방법은 두 벡터사이의 각도에 집중합니다.
투영 관점에서의 내적은 각도가 필요하지 않았었습니다.
위그림에서 빗변 b^의 길이를 단위벡터인 1로 두겠습니다.
그러면 우리는 cos함수 공식에 따라서 다음과 같은 식을 유도 할 수 있습니다.
결과적으로 두 벡터의 내적의 결과는 는 두 벡터의 내적과 같습니다.
이 아이디어를 보면 두 벡터중 하나를 스케일링(단위벡터로) 하면 내적과 코사인사이의 관계를 표현합니다.
내적의 증명
위처럼 a-b벡터를 그리면 삼각형을 만들 수 있으므로
분배법칙과 제2코사인법칙을 통해 벡터의 내적을 증명할 수 있다.
마찬가지로 a는 (a1, a2, a3), b는 (b1, b2, b3)로 가정하면
a-b는 (a1-b1, a2-b2, a3-b3)가 되고,
위의 제2코사인법칙 식에 대입하면 ab cosθ = a1b1 + a2b2 + a3b3를 유도할 수 있다.
두벡터의 각도를 측정하려면 어떻게해야 할까요?
우리는 앞전에 두벡터의 내적을 통해서 cosX값을 알수 있엇습니다. 이에서 우리는 X각도만 추출하기 위해서는 코사인 함수의 역함수에 해당 값을 넣어주면 값을 추출해낼 수 있습니다.
Atan2 함수를 이용해 두 벡터가 이루는 각을 구해서 비교해도 동일한 결과를 얻지만
단위 벡터를 구한후 내적을 계산하는 방식이 atan2함수를 호출하는 것보다 더 효율적이다.
또한 우리는 내적을 통해서 벡터간의 위치를 판별 할수 있습니다.
게임 제작과정에서 공간을 파악하는 데 가장 유용하게 활용되는 사례는 목표물이 캐릭터의 앞에 있는지, 뒤에 있는지를 구분하는 것이다.
벡터의 크기 값은 언제나 양수이므로 벡터의 내적의 부호는 cos함수가 결정한다.
Cos 함수는 -90 < x < 90도 영역에 대해 양의 부호를 가지고 있고 90,-90도 에서는 0, 나머지 범위에서는 음의 부호를 가지고 있다.
cos 그래프를 보면 다음과 같다.
그렇다면 벡터 내적의 부호는 두 벡터가 이루는 사잇각의
범위에 따라 결정될 것이다. 첫 번째 벡터를 캐릭터의 시선
방향으로 생각한다면두 번째 벡터는 시선 벡터에서부터 멀어질
수 록 사잇각이 커질 것이다. 하지만 cos함수는 (-90~90)영역에
대해 양의 부호를 가지므로 두 번쩨 벡터가 보라색으로 칠해진
영역에 존재한다면 내적 값은 언제나 양의 부호를 가진다.
이를 응용 하면 내적의 부호만 가지고도 두 벡터가 같은 방향을 향하는지, 아니면 서로 마주보는지를 확인할 수 있다.
•
벡터 내적의 결과가 양수 : 두 벡터는 같은 방향을 향하고 있다.
•
벡터 내적의 결과가 음수 : 두 벡터는 다른 방향을 향하고 있다. 벡터는 위치의 개념이 없으므로
•
두 벡터는 서로 마주보고 있다로도 해석 할수 있다.
•
벡터 내적의 결과가 0 : 두 벡터는 서로 직교한다
이 성질을 응요하면 앞뒤 판별 기능을 구현 할 수 있다.
캐릭터가 바라보는 방향의 시선벡터 f
목표물의 위치에서 캐릭터의 위치를 빼서 캐릭터에서 목표물로향하는 벡터 v
두 벡터의 사잇각을 a
•
벡터 내적의 결과가 양수 : 캐릭터 앞에 목표물이 있다.
•
벡터 내적의 결과가 음수 : 캐릭터 뒤에 목표물이 있다
•
벡터 내적의 결과가 0 : 캐릭터 바로옆에 목표물이 있다.
이번에는 캐릭터에 시야각이라는 특성을 부여해주자. 캐릭터에 부여한 시야각이
b라면 양쪽으로 균등하게 보다 작거나같은지 비교하는 문제가 될 것이다.
내적에 비례하는 cos함수는 그림에서 볼듯있듯이 [0~180] 범위에서는 각이 커질수록 값이 작아지는 성질을 지닌다. 따라서 해당 범위에서 각이 작을 수록 cos함수의 값은 반대로 커진다.
다음의 과정으로 캐릭터의 시야에 목표물이 탐지 됐는지 판별해보자.
1.
시야각을 절반 나눈 각의 cos를 미리 계산해둔다.
2.
캐릭터의 시선 벡터 f 를 구하고 이의 크기를 1로 정규화 시킨다.
3.
캐릭터에서 목표물로 향하는 벡터 v 도 정규화 시킨다.
4.
내적 f•v 의 계산 결과는 cos가 된다. 이를 앞서 계산해둔 cos와 비교한다.
•
f•v >= cos
•
f•v < cos
Atan2 함수를 이용해 두 벡터가 이루는 각을 구해서 비교해도 동일한 결과를 얻지만
단위 벡터를 구한후 내적을 계산하는 방식이 atan2함수를 호출하는 것보다 더 효율적이다.
또다른 사용 예시로는 조명계산에도 자주 사용된다.
현실세계와 비슷한 조명효과를 만들기 위해 고안된 방법으로 램버트 반사 모델이 있다. 이 모델을 고안한 스위스의 수학자 요한 하인리히 램버트의 이름을 따서 지어진 램버트 반사 모델은 컴퓨터 그래픽스에서 표면에서의 조명 모델 계산을 위해 쓰인다.
광원이 물체를 향해 직사광선을 발사하는 상황을 가정해보자. 빛을 받아 표면에서 반사되는 빛의 세기는 두 벡터가 만드는 사잇각의 cos함수에 비례한다는 것이 램버트 반사 모델의 주요 내용이다. 표면이 수직으로 향하는 벡터가 N 표면에서 광원으로 향하는 벡터가 L이라면
외적(Vector Cross Product)
또다른 벡터의 곱셈연산으로는 외적이 있습니다.
cross product라고 하여 각 원소를 교차하여 곱하여 뺴는 방식의 연산입니다.
외적의 예시는 다음과 같다.
우리는 여기서 주의깊게 봐야할 것은 내적은 cos값 (스칼라)를 반환했었고 외적은 또다른 벡터를 반환한다는 점이다. 또한 두 벡터의 외적의 계산 순서를 바꾸어서 연산을 하면 AxB BxA 의 외적결과가 다르다는 것을 알아한다. (교환법칙이 성립되지 않는다.)
기하학적으로 외적은 두벡터에 수직인 벡터를 생성한다.
외적으로 생성된 벡터의 길이는 a와 b의 크기와 a와 b사이의 각도의 의 곱과 같다.
결과적으로 이 값은 두변 a,b로 이루어진 평생사변형의 면적과 같습니다.
평행사변형의 넓이를 bh라고 하면 다음과같은 식을 유도할수 있습니다.
우리는 aXb가 a벡터와 b벡터에 수직인 벡터라고 말했습니다.
두벡터가 평행하거나 또는 a또는 b가 0벡터인 경우에는 aXb 외적의 결과는 0입니다.
떠라서 외적은 0벡터를 다른 모든 벡터와 평행한 벡터로 해석합니다.
하지만 수직인 벡터는 두가지의 경우가 있습니다. 2차원을 예로 들면 다음과 같은 2가지의 경우가 생깁니다.
3차원에서의 두벡터의 외적을 예시로 들면 다음과 같습니다.
외적은 교환 법칙이 성립하지 않는다.
뺄셈에서 두 수의 순서를 바꾸어서 계산하는 것처럼 외적도 순서를 바꾸면
반대 방향의 벡터가 나온다.
외적연산을 순서를 바꾸어서 진행하게 되면 우리는 다음과 같이 부호가 바뀌는 것을 확인 할 수 있습니다.
외적은 결합법칙도 성립하지 않는다.
하지만 덧셈에 대한 분배법칙은 성립한다.
U x (V + W) = U x V + U x W
내적 외적 비교
내적 | 외적 | |
계산 결과 | 스칼라 | 벡터 |
교환 법칙 | O | X |
결합 법칙 | X | X |
분배 법칙 | O | O |
연산 방법 | 같은 요소 사용 | 다른 요소 사용 |
이렇게 서로 대립되는 내적과 외적의 성질은 각 연산이 가지는 부족한 부분을 상호보완하는
기능으로 활용된다.
(부록) 선형대수학에서의 항등식