내적의 정의
물체가 빛을 밭으면 밝은 부분과 어두운 부분이 생기는데
이런 명암을 컴퓨터그래픽으로 모델링 할 때 벡터의 내적 연산이 이용된다.
또한 위 사진에서 사과의 뒷부분(보이지 않는 곳)을 렌더링에서 제외시키기위한 계산에서도 벡터의 내적이 사용된다.
검은색으로 그려진 선은 각 폴리곤으로부터 카메라쪽을 향하는 벡터를 나타낸 것이다.
이 두 벡터 사이의 각도가 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 |
---|