게임 기본편 게임을 지탱하는 기초 수학 6 벡터의 내적
CC사관학교
여러분 안녕하십니까
게임소확의 이득우입니다
이번 시간에는 내적에 대해 알아보도록 하겠습니다
내적이란 무엇인지
그리고 내적을 어떤식으로 활용할 수 있는지에 대해서 소개해볼까 합니다
벡터 내적의 개념
자 벡터의 내적이라고 하는 것은
벡터상에서 동작하는 어떤 특별한 연산 방법이라고 할 수가 있는데요
앞서서 우리가 벡터에 대해서 기본적인 연산에 대해서 알아봤었죠
벡터와 벡터의 덧셈,벡터와 스칼라의 곱셈
이 두가지가 바로 벡터가 가지고 있는 기본 연산이었고
이 기본 연산을 사용해 우리는 선형 조합식을 만들어서
새로운 벡터를 벡터 공간 안에서 생성할 수가 있었습니다
하지만 이런 기본 연산만 가지고 벡터를 활용하기에는
조금 부족한 부분이 있는데요
그래서 수학자들이 유용하게 사용할 수 있는 특별한 연산을 발견해서
이것들이 지금 응용 단계에서 굉장히 많이 활용이 되고 있습니다
그 두가지가 벡터의 내적과 외적 인데요
이번 시간에는 그 중에 하나인 내적 연산에 대해서 알아보는 겁니다
유용한 연산들은 어떤 것들이 있는지 정리해 봤는데
벡터와 벡터의 곱셈
즉,각 요소들끼리 곱하는 연산도 하나 생각해 볼 수가 있습니다
근데 이것은 주로 이제 색상끼리 혼합할 때 많이 사용하는 방법이고
그 외적인 부분에서 벡터를 응용할 때는 그렇게 사용되지는 않습니다
그 다음에 지금 이제 이야기할 벡터의 내적은
거의 대부분의 벡터의 응용 과정에서 많이 사용한다
거의 한 70-80%는 거의 벡터 내적으로 시작한다고 해도 과언이 아닐 정도로
모든 응용 단계에서 항상 사용되는 중요한 연산이라고 할 수가 있습니다
그 다음에 벡터의 외적이란 연산이 있는데요
이것은 3차원에서만 성립하는 특별한 연산이고
이후에 우리가 3차원을 진행할 때
이때 외적에 대해서 다시 설명을 드릴 예정입니다
자 그러면 오늘의 주제인 벡터의 내적에 대해서 알아보겠는데요
벡터의 내적은 보시는 것처럼
이렇게 2차원 벡터 2개가 있을때
각 요소
x 요소들끼리 곱하고 y 요소끼리 곱한 다음에
서로 더해주는 형태의 연산을 의미합니다
지금 예제에서는 2차원에 대한 부분만 제가 예를 들었는데
이건 3차원 4차원 5차원
이렇게 n 차원으로 쭉 늘어나도
같은 요소들끼리 곱한 다음에 더하기 때문에
어떤 차원의 벡터든지 상관없이 동작하는
아주 평범한 연산이고
여기서 알 수 있는 것은
벡터 내적은 각 요소들을 곱한 다음에 더해주기 때문에
항상 결과 값은 스칼라가 되는 것을 알 수 있습니다
자 이러한 벡터 내적이 가지고 있는 연산의 성질에 대해서
제가 정리해 봤습니다
먼저 교환법칙이 성립합니다
당연히 스칼라의 곱셈과 덧셈으로 진행이 되기 때문에
교환법칙이 성립하는 더셈 연산과 곱셈 연산에 대해서
교환법칙이 성립하는 구조의 특징상
벡터 내적은 교환법칙이 성립한다고 할 수가 있습니다
그 다음에는 결합법칙인데요
사실 결합법칙이라고 부르기 애매한게
이미 내적을 한 순간에는 스칼라 값으로 변하기 때문에
이것이 동등한 연산이라고 보기는 어렵습니다
여기서 스칼라 값이 나왔기 때문에
스칼라 벡터 연산이 되고요
이 또한 마찬가지로 스칼라와 벡터 연산으로 되기 때문에
어쨌든 지금까지 우리가 살펴본 동등한 요소들끼리의
두 번 연속 진행하는 연산 형태가 아니라는 것이죠
그래서 결합법칙은 어쨌든
성격 자체도 성립하지 않고 결과 값도 다르기 때문에
결합법칙은 성립하지 않는다 라고
짤막하게 요약할 수가 있습니다
그렇다면 분배법칙은 어떻게 될까요
분배법칙의 경우에는
어차피 우리가 벡터를 먼저 계산하면 벡터가 되고
이것을 내적하면 스칼라 값이 되고요
마찬가지로 우리가 각각을 내적을 진행하면
스칼라와 스칼라의 덧셈이 되는데
이것은 이제 결과가 동일하게 진행이 됩니다
그렇기 때문에 분배법칙은 성립한다
이렇게 정리할 수가 있겠습니다
다시 정리하면
벡터 내적은 교환법칙이 성립하지만 결합법칙은 성립하지 않고
분배법칙은 성립한다로 요약할 수가 있겠습니다
이렇게 분배법칙이 성립하는 벡터 내적의 식을
우리가 특징을 살펴보면
같은 벡터의 덧셈을 내적한다라고 하면
여기서는 u u와 u.u와 u.v
v.u와 v.v
그런데 교환법칙이 성립하기 때문에 u.v와 v.u는 같기 때문에
u.u, v.v, e.u.v의 형태로 나오게 되고요
여기서 우리가 같은 벡터를 내적하는 결과에 대해서
잠깐 살펴볼 텐데요
같은 벡터를 내적하게 되면 여기서 보는 것처럼
같은 요소끼리 당연히 제곱 형태가 되겠죠
그리고 더하고 다시 두 번째 요소를 제곱하고
세 번째 요소를 제곱하고 네 번째 요소를 제곱해서 더하는
이런 형태가 만들어지는데
이것은 우리가 앞서 살펴본
벡터의 노름을 제곱하는 결과라고 볼 수가 있습니다
그렇기 때문에 우리가 같은 벡터를 내적한다는 것은
노름의 제곱, 벡터 크기의 제곱
벡터 길이의 제곱의 결과를 항상 가져오게 됩니다
그래서 위에 수식은 우리가 이렇게 바꿨을 수가 있는 거죠
크기의 제곱으로 바꿨으면
벡터 u 크기의 노름의 제곱
벡터 v 노름의 제곱
그 다음에 e.u.v의 형태로 진행이 된다
이렇게 수식이 만들어지게 되고
이 수식은 이후에 또 유용하게 사용되니까
잠깐 언급해 봤습니다
그래서 잠깐 정리한 것은
벡터 v의 노름은 x제곱과 y제곱
각 요소를 제곱한 것에 루트를 씌운 형태인데
같은 벡터를 제곱한 것은 이것을 제곱하는 결과가 항상 나오기 때문에
어떤 벡터
n차원의 같은 벡터를 내적하면 노름의 제곱이 된다
이렇게 결론이 나오게 됩니다
그러면 이러한 성질을 활용해서
벡터 내적을 어떻게 사용하냐면요
먼저 벡터 내적이 가지고 있는 성질을 파악해야 되는데
이것은 삼각함수와 밀접한 관계가 있습니다
어떤 삼각함수냐면 코사인 함수와 밀접한 관련이 있어요
그래서 벡터 내적에서 사실
우리가 실제로 게임을 제작할 때
응용할 때 가장 많이 사용하는 이유가
벡터 내적이 코사인 함수와 관련이 있기 때문에
이 코사인 함수가 가지고 있는 성질을 응용해서
다양한 상황에서 우리가 이걸 적용할 수가 있게 된다는 것이죠
자 그래서 그 공식이 어떻게 되냐면요
a와 b, 벡터 a와 벡터 b의 내적은
벡터 a의 크기와 벡터 b의 크기에
벡터 a와 b가 이루는 사이각의 코사인 세타를 곱하는 것과
동일하다는 수식이 있기 때문에 가능한 겁니다
자,이 수식이 어떻게 해서 유도되는지 잠깐 살펴보도록 하겠습니다
먼저 임의의 삼각형을 하나 그려보겠습니다
그래서 점 A,B,C가 있고
점 B를 원점에다 두었다고 생각을 하고요
그 다음에 점 B에서 점A로 향하는 벡터를 벡터 C
점B에서 점C로 향하는 벡터를 벡터a
그러니까 점의 건너편에 있는 변을 우리가 벡터 a 라고 하고
그 다음에 이쪽은 벡터 b 가 되겠죠
이런 형태로 구성을 하게 되면
이제 이 삼각형을 사용해 가지고 우리가 어떻게 저 위에
코사인 공식이 유도되는지 한번 알아보도록 하겠습니다
점B를 원점에 두고 변을 벡터로 설정할 때 각 점의 위치는
앞서서도 얘기했지만 b를 0,0 이라고 했을 때
점 c의 경우에는 평행하게 x축에 일치시킨다면
점 A의 건너편에 해당하는 변인 벡터 a 가 될 거고
그 다음에 양의 방향으로 우리가 설정하면
항상 절대값을 취해 가지고
벡터 a의 노름이 되겠죠
길이가 되겠죠
그래서 벡터 a 노름,0이 될 거고요
그 다음에 점 A의 좌표 같은 경우에는
지금 우리가 사잇각을
벡터 c와 벡터 a의 사잇각을 각 베타라고 가정했을 때
여기에서 높이를 우리가 구해야 되는데
이것은 우리가 단위1 삼각함수의 공식을 했을 때
단위1에서 밑에 어떤 빗변 벡터가 가지고 있는
x축 성분은 코사인 세타
y축 성분은 사인 세타였고
그 다음에 그 반지름이 r이면 r사인세타,r코사인세타라고 이야기했죠
그러면 여기에서 빗변 벡터 c의 크기를 우리가 알 수 있다면
각은 베타라고 나와 있으니까
점A의 좌표는 C의 노름의 코사인 베타
C노름의 사인 베타가 됩니다
이러한 기본적으로 점의 위치가 정해져 있다면
우리가 벡터 b를 계산을 해 볼 텐데요
벡터 b는 점C에서 점A
점A에서 점C로 향하는 벡터라고 할 수가 있고요
이것의 좌표는 위에 있는 것을 참고해서 다음과 같이 구할 수가 있습니다
그렇다면 이것을 우리가 제곱한
벡터 b의 크기를 먼저 구한 다음에 이것을 제곱한 결과를 살펴볼 텐데요
각각 요소를 제곱하면 이런 형태로 전개가 되고
결과적으로는 벡터 a의 노름의 제곱과 벡터 c의 노름의 제곱
그 다음에 2벡터 a와 벡터 c의 노름을 서로 곱한 것에
사잇각 코사인 베타를 구해준 결과가 나옵니다
그런데 벡터 b의 크기를 제곱했다는 것은
이것은 벡터 b와 벡터 b를 서로 내적한 결과랑 동일하다는 것이죠
그래서 이 결과는 벡터 b와 벡터 b를 서로 내적한 겁니다
벡터 a에서 벡터 c로 바꿔서 표현할 수가 있는데요
그것들을 서로 내적한 것이죠
그것들을 서로 내적한 것이고
자,이 결과는
벡터 a의 노름의 제곱, 벡터 c의 노름의 제곱에다가 마이너스가 붙여서
2ac가 마이너스 2 벡터 a와 벡터 c의 내적 a.c로 정리가 됩니다
이 값이 뭐랑 같냐면 위에 값이랑 같다는 거죠
그렇다면은 여기에서
a의 노름의 제곱과 c 노름의 제곱이 상쇄가 되면서,
소거가 되면서
결과적으로 a와 c
a.c는 a의 크기와 c의 크기의 사잇각 코사인 베타를 곱한 것과
그 값이 동일하다라고 우리가 이해할 수가 있게 됩니다
이런 결론을 만들어낼 수가 있게 됩니다
그래서 이런 코사인 삼각함수의
코사인 공식을 내적을 사용해서 유도해 봤고요
여기서 두 벡터의 크기가 1이라면은
크기가 1이기 때문에
더욱 더 간략하게 코사인 세타
사잇각에 대한 코사인 값으로 귀결이 됩니다
이 부분이 굉장히 유용하게 사용하니까
계속해서 코사인 함수와 비례하는 내적의 성질을
우리가 계속 주목해 주면 되겠습니다
자,이러한 코사인 함수가 가지고 있는 성질을 어떻게 응용할 수 있는지
가장 대표적인 방법으로는
직교성 판별입니다
두 벡터가 서로 직각으로 구성되어 있는지를 판별하는 것인데요
여기서 내적의 값이 0이 되는 경우는
결국에는 코사인 세타 값이 0이 되는 경우 밖에 존재하지 않겠죠
만약에 벡터의 크기가 있다고 하면
0이 아니라고 하면
당연히 코사인 세타가 0일 때만
이 값이 0이 나오게 되겠죠
그렇다면 언제 코사인 세타가 0이 나오냐면
90도와 270도
즉 90도와 마이너스 90도일 때 코사인 세타가 0이 나오고요
그것은 바로 다음과 같이 두 벡터가 서로 직교할때만
0이 나온다는 성질을 가지게 됩니다
그래서 우리가 벡터 내적이 가지는 직교성을 사용한다면요
무조건 0이
어떤 두 벡터를 내적했을 때 0이 나왔다
그러면 우리가 그냥
이 두 벡터는 서로 직각이네 라고 판단할 수가 있는 겁니다
표준 기저 벡터 1,0과 0,1을 서로 내적하면 어떻게 될까요
1 곱하기 0 더하기 0 곱하기 1이 되니까
당연히 0이 나오죠
그렇다면 이것은 서로 직교한다라고 우리가 파악할 수가 있는 거고요
여기서 각 세타만큼 각각 돌렸을 때
당연히 직교하고 있던 벡터를 세타만큼 돌렸으니까
우리는 얘도 직교한다는 결론을 내릴 수 있지만
그냥 이런 시각적인 상황을 인지하지 않고
그냥 두 벡터의 값을 내적시켜 버리면 됩니다
그러면 코사인 세타,사인 세타와
마이너스 사인 세타, 코사인 세타를
그냥 서로 내적 해보면
마이너스 코사인 세타, 사인 세타
사인 세타, 코사인 세타가 되기 때문에 0이 되는 것을 알 수가 있죠
그래서 이 두 가지의 벡터는
회전을 시킨 두 벡터는 서로 직교한다는 결론을 내릴 수가 있습니다
여기서 이제 조금 더 발전을 시키면요
리지드 트랜스포메이션이라는 게 있습니다
이게 뭐냐면
리지드는 굳건하다, 단단하다 라는 뜻이죠
그래서 이것은 물리학에서 강체라고 이야기하고
물체의 모습이 변형되지 않는 어떤 최소 단위를 의미하는데
아무튼 리지드 바디
물리학에서는 리지드 바디라고 이야기하는
게임 개발에서는 많이들 들어봤을 겁니다
그런 개념하고 비슷하다고 생각하시면 될 거예요
이 리지드 트랜스포메이션이라고 하는 것은
결국에는 어떤 물체가 변환이 일어났을 때
그 모습이 그대로 유지되는 변환을 의미합니다
리지드 트랜스포메이션
그래서 이 리지드 트랜스포메이션이 되는 변환의 조건은
변환이 됐을 때 변환 이후에 기저 벡터의 크기가 1을 가지고 있고요
그 다음에 모든 기저 벡터가 서로 직교하고 있어야 됩니다
왜냐하면은 원공간의 벡터들이 서로 직교하고 있기 때문에
변환된 이후에도 서로 직교하는 그 성질을 가지고 있어야 되죠
그 다음에 마지막으로 행렬식 값이 1이 되어야 됩니다
뒤집히는 경우를 우리가 파악해서 방지하기 위해서
디터미넌트 만약에 어떤 함수 행렬이 있을때
그 행렬식 값이 1인 것을 우리가 확인하면
리지드 트랜스포메이션
얘는 모습이 절대 변하지 않는다라는 걸
보장할 수가 있는데요
이것을 만족하는 대표적인 변환이 회전변환 입니다
여기 회전변환을 살펴보면요
각각에 대해서 우리가 그 벡터의 크기를 구했을 때
우선은 공간을 구성하는 모든 기저 벡터의 크기가 1인 것을 볼 수가 있습니다
자,기저 벡터 코사인 세타와 사인 세타를 우리가 봤을 때
얘의 노름은 코사인 제곱 세타 더하기 사인 제곱 세타인데
이것은 지난번에 피타고라스의 정리에 의해서
1이라는 것을 알 수가 있었죠
얘도 마찬가지로 제곱하면 음의 부호가 날아가게 되니까
코사인 제곱 세타 사인 제곱 세타가 되면서
두 번째 기저 벡터도 1인 것을 알 수가 있습니다
이것은 가로로 봐도 마찬가지고 세로로 봐도 마찬가지입니다
그 다음에 서로 직교하고 있다는 것은
우리가 방금 전에 확인했었죠
그 다음에 행렬식의 값을 살펴보겠습니다
ad-bc
즉,코사인 제곱 세타 더하기 사인 제곱 세타가 되면서
ad-bc 값
행렬식의 값도 1인 것을 확인할 수가 있습니다
자 그래서 이러한 회전 변환은
변화한 후에 어떤 물체의 모양이 형태가 변하지 않는다는 것을 보장해 주는
특별한 변환이라고 할 수가 있고
이것을 리지드 트랜스폼이라고도 이야기합니다
벡터 내적의 활용
자 이러한 벡터 내적을 실제적으로 어떻게 활용하는지 한번 살펴보겠습니다
대표적으로 앞뒤 판별을 많이 사용하는데요
벡터 내적이 가지고 있는 코사인 공식을 사용해서
목표물이 앞쪽에 있는지 뒤쪽에 있는지를 파악할 수가 있습니다
만약에 여기 그림에서 제가 어떤 사람이 있고
앞을 바라보는 시선 벡터가 있다고 생각해 봅시다
그러면 어떤 물체가 있을때
물체로 향하는 벡터
나한테서 물체로 향하는 벡터를 만들 수가 있겠죠
이것의 값이
사잇각을 세타라고 했을 때
내적을 우리가 진행하면 그것이 코사인 세타에 비례하게 되는데
코사인 세타의 경우에는
코사인의 그래프는 0을 기준으로
y는 x는 0일 때 1에서부터 이렇게 쭉 내려오는 형태가 되죠
어디까지 내려오냐면
플러스 90도 마이너스 90도까지 서서히 내려와 가지고
0에 도달하고
그 이후부터는 마이너스로 내려가게 됩니다
즉 마이너스 90도 부터 90도 까지는 양수를 가진다는 얘기고요
이것은 지금 이 사잇각을 우리가 봤을 때
플러스 90도 마이너스 90도가 되기 전까지 양의 값을 가진다는 겁니다
그 이후에는 음의 값을 가지게 되는 거죠
그렇다면 벡터의 크기라는 것은 절대로 음의 값이 나오지 않기 때문에
우리가 내적을 사용해서 결과 값이 양수가 나왔다
그러면 코사인 세타 값이 양수라는 얘기고요
음수가 나왔다고 하면은 코사인 세타 값이 음수라는 것을 의미합니다
따라서 두 벡터를 내적한 값이 양수라면
물체는 내 시선 방향과 같은 사이드
같은 방향에 있다는 것을 의미하고
이것을 앞에 있다라고 표현하는 거죠
그 다음에 내적의 값이 음수가 나왔다면 뒤에 있다라고
우리가 파악할 수가 있게 되는 겁니다
이것을 조금 더 응용하게 되면
어떤 시야를 판별하는 데도 유용하게 사용할 수가 있는데요
다음과 같은 상황에 똑같이 가정해 보겠습니다
내가 바라보는 방향을 기준으로 해서
내가 측정하고자 하는 물체 목표물과의 사잇각을 알파라고 했을 때
이 알파가 주인공의 설정된 시선각
베타 안에 들어와 있는지 바깥에 있는지
판별하는데 사용할 수도 있습니다
시야각이라고 하는 것은 시선벡터를 기준으로 해서
양쪽으로 균일하게 나눈 것이기 때문에
우리가 한쪽만 바라보면 시야각을 절반 나눈 2분의 베타 값이 되겠죠
이 안에 결국에는 목표물이 들어가 있는지
즉,알파가 2분의 베타보다 적은지를 우리가 파악하는
그런 과제가 있는 겁니다
시야에 탐지 된다고 하면 알파가 2분의 베타보다 작은 상황이 되겠죠
그런데 우리는 이 시야각은 알고 있지만
알파에 대한 각을 알고 있지는 않습니다
재야 되죠
각을 재려면 지난번에 언급한
아크 탄젠트 같은 역함수를 사용해서 구할 수도 있지만
내적을 사용하면 보다 효율적으로
이 코사인의 알파 값은 몰라도
코사인 값이 가지고 있는 성질을 사용해서
우리가 바로 구할 수가 있게 됩니다
자 이걸 어떻게 파악하냐면요
우선은 코사인 2분의 베타 값을 미리 저장해둡니다
시야각 같은 경우에는
캐릭터에 설정된 시야 범위 같은 경우에는 바뀔 일이 많이 없기 때문에
사실상 미리 구해놓고 저장해 두는 것이 유리하다고 할 수가 있고요
그 다음에 시선 벡터와 목표물로 향하는
이 벡터를 노멀라이즈
정교화 시켜 가지고 크기를 1로 만들어줍니다
그렇다면 두 벡터가 가지고 있는 내적 값의 결과는
코사인 알파 값이 되겠죠
그런데 코사인 함수의 성질을 보면
0도에서부터 이렇게 쭉 내려가지 않습니까
언제까지 내려가냐면 180도까지 내려갑니다
쭉 내려갑니다
그렇기 때문에 코사인 함수는 각이 증가할수록 값이 감소하기 때문에
우리가 이 알파 값이 2분의 베타
코사인 알파 값이 코사인 2분의 베타보다 크다면
그 각은 더 작다는 것을 의미합니다
그래서 두 코사인 값을 비교해서
코사인 알파 값이 코사인 2분의 베타 값보다 더 크면
이 목표물은 시야 범위 내에 있다라고
각을 몰라도 이것을 파악할 수가 있게 됩니다
종종 역함수를 사용하는 그런 경우들도 사용은 하지만
이것보다는 내적이 가지고 있는 성질을 사용해서 구하면
보다 효율적으로 구할 수가 있다는 것을 알아두시면 좋겠습니다
그 다음에는 음영 계산
컴퓨터 그래픽 3차원을 다룰 때
빛이 가지고 있는 방향에 따라서 명암
쉐이딩이라고 하죠
명암을 지정을 할 때 내적이 굉장히 유용하게 사용이 되는데요
우리가 어떤 광원이 있을때
빛이 이렇게 딱 들어와서 표면에 거친 다음에
그 다음에 우리 눈으로 들어오는 과정을 거치게 되는데
우리가 이 빛이 비치는 그 양이
표면이 향하는 방향에 직각일수록 그 양이 가장 많아집니다
들어오는 빛이 많아진다는 거죠
그리고 이게 점점 빛과 표면방향이
사잇각이 크면 커질수록
점점 들어오는 빛의 양이 이제 줄어드는 형태를 가지는데
그 줄어드는 형태가 바로
코사인 세타와 비례해서 줄어든다는 것이 렘버트 코사인 법칙 이라는
표면 방향과 광원의 사잇값에 따라서 음영이 결정되는
아주 단순한 공식이기 때문에
이것은 내적을 사용해서 쉽게 구할 수가 있습니다
그래서 표면의 방향 벡터와
표면에서 광원으로 향하는 벡터를 구하고
그 다음에 이 광원의 크기를 1로 정교화 시켜준 다음 내적을 시켜주면
이것은 해당 광원이 얼만큼 들어왔는지
명암을 결정해주는 중요한 요소로 작용하게 됩니다
그래서 표면의 방향 벡터를 N
그 다음에 표면에서 광원으로 향하는 벡터를 L 이라고 보통 표현해가지고
N.L이라고 많이 불리는데요
이 N.L로 명암을 만드는 아주 기본적인 공식이
렘버트 코사인 법칙을 사용해서 만드는 것을
디퓨저 쉐이더라고 보통 이야기합니다
그래서 이건 유니티 엔진에서 사용하는 예제에서 가져왔는데요
디퓨저 쉐이더라는 것이 지금 제가 설명드린
내적만을 사용해서 명암을 표현할 때
이러한 음영을 우리가 지정해 가지고 그릴 수 있다라는 것을
이해하시면 되겠습니다
그래서 이러한 렘버트 코사인 법칙의 N.L은
조명은 아주 기본적인 조명이고
여기서 이것을 기반으로 해가지고
복잡한 형태의 조명식으로 발전을 하게 되는데요
어쨌든 가장 밑바닥에서는 이 N.L이 자리 잡고 있다 정도만
여러분들이 이해해 주시면 될 것 같습니다
마지막으로는 투영 벡터 공식에 대해서 설명 드릴 텐데요
이것은 어떤 벡터에다가
두 개의 벡터가 있을 때
하나의 벡터에 내가 투영을 했을 때
파악하는 공식이라고 할 수가 있습니다
여기 벡터 u와 v 가 있을때
여기서 투영한 벡터 u 를 v 에다가 투영하게 되면
v 프라임이라고 제가 이야기하겠습니다
이 v 프라임이라고 하는 것은 결국에는 v에 투영했기 때문에
v와 방향이 동일합니다
크기만 다르겠죠
크기만 다르고 방향만 갖게 되겠죠
그렇다면은 이 벡터 v 프라임을 어떻게 구하냐면
방향이 같고 크기만 다르기 때문에
일단은 v 를 정교화 시켜줍니다
정교화 시켜줘가지고 이렇게 v hat을 만들어줍니다
크기가 1인 단위 벡터 v hat을 만들어주고
그 다음에 v 프라임이 가지고 있는 벡터의 크기만큼 여기다 곱해 주면
v 프라임을 우리가 구할 수가 있겠죠
그런데 이 v 프라임의 크기를 어떻게 구하냐
얘가 가지고 있는 노름을 어떻게 구하냐라고
이제 그게 관건인데
그것은 우리가 벡터 u 를 알고 있기 때문에
벡터 u 가 가지고 있는 크기에다가 코사인 세타를 곱해 주면
바로 v 프라임의 크기를 구할 수가 있습니다
자 그렇다면 그 값의 코사인 세타를 어떻게 구할 수 있냐로 귀결할 수가 있는데
앞서서도 코사인 세타의 값을 우리가 내적으로 구할 수가 있다고 했죠
그렇기 때문에 내적의 식을 다시 봤을 때
u와 v 를 내적한 것은 u의 크기와 v의 크기를 곱하고
코사인 세타를 곱한 것이 되고
결국에 그 사잇각 코사인 세타는
이런 식으로 우리가 바꿔서 계산할 수가 있다는
결론이 나오게 됩니다
자 그러면 이 값을 우리가 다시 여기에 대입해서
서로 곱해 주면
투영 벡터의 최종식을 구할 수가 있는데요
v 프라임
최종 투영 벡터를 구할 수가 있는데요
여기서 u.v 에다가
분모는 u의 크기와 v의 크기가 되는데
여기서 v hat은 분모가 v고
그 다음에 위에가 v 였죠
그렇기 때문에 v의 크기를 두 번 사용했기 때문에
v의 노름의 제곱이 되는 것이구요
u.v.v가 된다고 볼 수가 있고
그 다음에 앞서서 u를 우리가 곱하기 때문에
분모에 있는 u가 서로 상쇄가 되겠죠
그래서 최종 공식이 이렇게 나오고
노름의 제곱이라는 것은
같은 벡터를 두 번 곱한 결과와 동일하다고 할 수 있으니까
이렇게도 표시할 수가 있습니다
둘은 이제 같은 식이라고 보시면 되고요
여기에서 만약에 내가 투영하려는 벡터 v의 크기가 1이라면
굳이 크기를 구할 필요가 없기 때문에
위 식은 조금 더 단순하게 구할 수가 있습니다
자 그럼 이런 투영 벡터의 공식은
우리가 앞으로 진행할 다양한 벡터의 응용 과정이나
아니면 여러가지 평면의 방정식 이라든지
이론에서 중요하게 사용이 되는데요
우선은 이렇게 기본적인 공식이 있다 정도만 설명을 드리고
응용 방법에 대해선 나중에 평면의 방정식을 다룰 때
보다 자세하게 설명드리도록 하겠습니다
자 지금까지 벡터 내적에 대해서 알아봤습니다
이번 강의는 여기까지 입니다
수업 듣느라 고생하셨습니다
감사합니다
벡터 내적의 개념 벡터의 내적 벡터의 각 요소끼리 곱한 후 더하는 형태의 연산
벡터 내적의 성질 교환 법칙을 만족함 결합 법칙을 만족하지 않음 분배 법칙을 만족함 a,b곱하기c,d는 ac더하기bd
n차원의 같은 벡터를 내적 하면 노름의 제곱이 됨
벡터 내적의 코사인 공식 a 곱하기 b는 벡터 a 벡터 b 코사인세타 두 벡터의 크기가 1일때 스칼라 a곱하기 스칼라 b는 코사인 세타
벡터 내적의 개념 벡터 내적의 직교성 판별 두 벡터가 직교한다는 것을 내적으로 증명할 수 있음
코사인 세타,사인 세타 곱하기 마이너스 사인 세타,코사인 세타는 0
리지드 트랜스포메이션 물체의 형태를 그대로 유지하는 변환 회전 변환은 물체의 형태를 변형시키지 않음
조건 공간을 구성하는 모든 기저 벡터의 크기가 1 모든 기저 벡터가 서로 직교하고 있어야 함 선형 변환의 행렬식 값이 1
백터 내적의 활용 앞뒤 판별 두 벡터를 내적 한 결괏값이 양수일 때 물체는 시선 앞에 위치함
두 벡터를 내적 한 결괏값이 음수일 때 물체는 시선 뒤에 위치함
시야 판별 시선 벡터와 목표물로 향하는 벡터의 내적은 코사인 알파 코사인 알파의 값이 코사인 2분의 베타보다 큰 값이라면 목표물은 시야 내에 있음
음영 계산 램버트 코사인 법칙 물체 표면이 반사하는 빛의 휘도는 표면 방향과 광원 방향의 사잇각의 코사인 값에 비례함
셰이더 조명 공식 N.L 공간 표면의 방향 벡터 N 표면에서 광원으로 향하는 벡터 L
투영 벡터 공식 하나의 벡터를 다른 벡터에 투영시킨 벡터를 구하는 식 v`는 벡터 v제곱분의 u곱하기 v곱하기 v는 v곱하기 v분의 u곱하기 v곱하기v
투영하려는 벡터의 크기가 1일때 v`는 u곱하기 v곱하기 v