본문 바로가기
공부/DirectX11

[DX11] 반사광 방향 벡터 유도하기

by 김샤랑 2023. 5. 15.

[DX11] 반사광 방향 벡터 유도하기


 

목표 :  광원 방향 벡터와 도형의 정점 normal 벡터만 가지고 반사 벡터를 알아내라.

 

주어진 상황을 그림으로 정리하면 다음과 같다.

추가적으로 vLight와 vNormal은 방향 단위 벡터로 크기는 1이다. 

 

학창시절에 배운 과학기억을 되살펴보면 빛의 입사각과 반사각은 동일하다는 사실이 생각날것이다. 

또한 벡터의 덧셈을 상기해본다면 다음과 같은 두벡터의 합이 우리가 원하는 벡터R이라는 사실도 알게될 것이다.

 

 

1. vA를 구해보자. 

| vA |는 수식을 통해 |vLight|*cosθ 이다. vLight 크기는 1이므로 |vA| = cosθ

cosθ 는 내적을 통해서 구할 수 있다. 

 

다만 내적을 할때 주의할 점이 있다. 

우리가 원하는 cosθ는 오른쪽 이미지의 각도이다. 

즉 vLight의 방향을 반대(-)로 바꾸고 내적을 해야한다. 

 

-vLight • vNormal = |vLight||vNormal|cosθ 이다. 두 벡터의 크기는 1이므로

-vLight • vNormal = cosθ  라는 결론.

 

| vA | = cosθ = -vLight*vNormal

 

vA는 아직 스칼라값이다. 이제 이걸 방향 벡터로 만들기 위해서 크기가1인 방향값만 가진 vNormal을 곱해준다.

그러면 vNormal 방향을 가진 vA 벡터가 된다.

 

vA = vNormal * (-vLight • vNormal) 

 

 

2. 발상 바꾸기. 

 

우리는 vA + vB를 구해서 vR을 구하고자 했다. 하지만 vLight 벡터를 더 길게 늘여서 아래로 내린다면

다른발상도 가능해진다. 

 

vR 은 vLight + 2 *vA 라고도 설명이 가능하다. 

우리는 vA를 구했으니 바로 정답을 알 수 있다!

 

vA = vNormal * (-vLight • vNormal) 

 

vLight + 2 * vA = vLight + 2(vLight • vNormal)*vNormal

 

 

최종으로 vR (반사벡터) 는 vLight + 2*(-vLight • vNormal) * vNormal 이다.

 

 

 

 

구글에 반사벡터를 치면 동일한 결과를 보인다. 


 

 

최종 정리

 

'공부 > DirectX11' 카테고리의 다른 글

[DX11] 원뿔 도형 만들기 (Cone Mesh)  (0) 2023.05.22
[DX11] ChatGPT로 좌표계 복습하기  (0) 2023.05.03

댓글