본문 바로가기
3D수학

벡터의 내적

by witn331ss 2023. 6. 1.

내적의 정의

 

물체가 빛을 밭으면 밝은 부분과 어두운 부분이 생기는데

이런 명암을 컴퓨터그래픽으로 모델링 할 때 벡터의 내적 연산이 이용된다.

 

또한 위 사진에서 사과의 뒷부분(보이지 않는 곳)을 렌더링에서 제외시키기위한 계산에서도 벡터의 내적이 사용된다.

 

 

 

 

검은색으로 그려진 선은 각 폴리곤으로부터 카메라쪽을 향하는 벡터를 나타낸 것이다.

 

이 두 벡터 사이의 각도가 90도 이하라면 해당 폴리곤은 카메라를 바라보고 있다고 판단할 수 있다 (a,b)

반대로 각도가 90도보다 크다면 카메라를 등지고 있다고 판단 할수도 있겠다. (c,d)

 

그렇다면 이걸 어떻게 계산해야할지 살펴보자.

 

내적의 계산과정

백터의 내적을 계산하기 위해서는 

먼저 차원이 같은 두 벡터가 필요하다.

 

벡터의 각 성분들끼리 곱셈을 한 뒤 그 결과를 알려주면 내적이 계산된다.

 

a = [2,2] b = [-1,0]

a · b = [2 * -1] + [2 * 0]
= -2 + 0
= -2
c = [-2,-2] d = [-1, 0]

c · d = [-2 * -1] + [-2 * 0 ]
= 2 + 0
= 2

여기서 알 수 있는 사실은 두 백터를 내적하면 벡터가 나오는 것이 아니라

단순한 숫자값이 나온다는 사실이다.

 

또한 이 결과값의 부호를 통해 폴리곤의 면이 카메라를 향하는지 또는 등지고 있는지를 알아낼 수 있다.

 

내적의 결과가 양수로 나온다면 두 벡터 사이의 각이 90도 보다 같거나 작다는 의미이고

음수로 나온다면 각이 90도 보다 크다는 사실을 알 수 있다.

 

이 그림을 다시본다면

벡터 a와 b는 카메라를 향하는 시선 사이의 각도가 90도보다 작다는 것을 의미한다.

반면 c와 d는 카메라와의 각도가 90도 보다 크다는 것을 알 수 있다.

 

여기서 중요한 사실은 각도가 몇도 인지 계산할 필요없이

내적 결과값의 부호만으로 각도의 범위를 알아낼 수 있는 사실이다.

 

두 벡터 사이의 각도를 구하려면 아크코사인 함수를 이용해야하는데

이건 값이 무겁기 때문에 최적화에 문제가 될 수 있다.

 

따라서 몇번의 곱셈 덧셈으로 끝낼 수 있는 내적이 더 이득인 것이다.

 

반사벡터 구하기

내적을 이용하면 반사벡터도 쉽게 구할 수 있다.

 

벽에 부딪친 당구공이 어느 방향으로 튕겨 나가는지 상상해본다면

반사벡터가 어떤 모습인지 대강 그려질 것이다.

 

벡터 P가 공의 속도 벡터라고 한다면 반사벡터를 구하는 공식은 다음과 같다.

 

reflect = p +2n(-p·n)

 

프로그래밍 언어로 푼다면

float3 reflect = velocity + 2 * normal * float3.dot(-velocity, normal);

N은 벽의 법선벡터를 의미한다.

공은 벽을 향해 대각선 방향인 P의 속

도로 움직이고 있다. 여기서 P는 공의 속도 벡터이다.

 

반사벡터를 구하기 위한 첫 단계로 P의 방향을 바꿔준다 (-P)

 

-P와 벽의 법선백터인 N을 내적한다. 내적의 결과로는 스칼라값이 하나 나올 것이다. (-p∙n)

 

 

내적의 결과값인 법선벡터 n을 두배 곱해준다면 결과적으로 길게 늘어난 벡터가 생기게 된다. ( 2n(-p∙n )

 

위 결과값에 p를 더해서 반사 벡터를 구한다. ( p+2n(-p∙n) )

 

이것은 크기와 방향이 같아 어디에 있던지 결국엔 똑같은 벡터다

최종적으로 반사벡터가 구해진 모습이다.

'3D수학' 카테고리의 다른 글

행렬 (Matrix)  (2) 2023.06.02