[C++] 3.2.3 두 공의 충돌 : 법선 벡터
카테고리: C++ games
인프런에 있는 홍정모 교수님의 홍정모의 게임 만들기 연습 문제 패키지 강의를 듣고 정리한 필기입니다.😀
🌜 공부에 사용된 홍정모 교수님의 코드들 보러가기
🌜 [홍정모의 게임 만들기 연습 문제 패키지] 강의 들으러 가기!
Chapter 3. 게임 물리 맛보기 : 공 두 개를 충돌시켜보자
벡터, 상대 속도 등등, 해당 강의에서 다루었던 물리학적 개념들이 문과생인 나에겐 생소하고 잘 와닿지 않았던 개념이라 강의를 필기하기에 앞서 개인적으로 따로 공부하여 정리해보았다.
🔔 법선 벡터(노말 벡터)
법선
: 접선에 수직인 선
노말 벡터
or법선 벡터
: 어떤 표면에 ‘수직’인 벡터.
평평한 땅
한 가운데에 막대기
를 꽂아둔다면 막대기
는 땅(표면)
에 직각으로 세워져있는 상태다. 이때 막대기
를 땅(표면)
의 법선 벡터라고 할 수 있다.
🔔 노말 벡터의 쓰임새
공간 상에서 평면끼리의 각
만약 땅(표면)
이 기울어져 언덕
이 되었다면 막대기
또한 똑같은 만큼으로 기울어질 것이다.
이처럼 법선 벡터는
각 표면
에서 90도씩 더해진 관계기 때문에 두 평면끼리 이루는 각도는 법선벡터끼리의 각도와 일치한다. 두 표면의 법선벡터끼리 각을 재거나 내적을 하면 이는 두 표면 자체끼리의 각에 대한 정보를 구하는 것이나 마찬가지다.
카메라와 오브젝트
오브젝트의 각 면의 노말벡터와 오브젝트로부터 카메라까지 향하는 거리 벡터의 내적
값을 구하면 해당 면이 카메라의 시야에 들어오는지, 즉 렌더링 해야하는지 아닌지를 판별할 수 있다.
- \(\vec{V}\) = 카메라까지의 벡터(종점) - 폴리곤의 각 면으로부터 (시점)
- 즉 \(\vec{V}\)벡터를 오브젝트의 각 면으로부터 카메라를 향하는 벡터라고 하면
- \(\vec{A}\cdot\vec{V}\) 내적값 > 0
- 예각
- 카메라의 시야에 들어오는 방향.
- A면은 카메라를 바라보고 있다고 판단되어 렌더링한다.
- \(\vec{B}\cdot\vec{V}\) 내적값 > 0
- 예각
- 카메라의 시야에 들어오는 방향.
- B면은 카메라를 바라보고 있다고 판단되어 렌더링한다.
- \(\vec{C}\cdot\vec{V}\) 내적값 < 0
- 둔각
- 카메라의 시야에 들어오지 않는 방향.
- C면은 뒷부분이라고 판단되어 렌더링하지 않는다.
- \(\vec{D}\cdot\vec{V}\) 내적값 < 0
- 둔각
- 카메라의 시야에 들어오지 않는 방향.
- D면은 뒷부분이라고 판단되어 렌더링하지 않는다.
🔔 두 공의 충돌에서의 노말 벡터
- 🔴 (빨간공)
- \(\vec{p_0}\) : 🔴의 중심좌표 (위치벡터)
- 🟡 (노란공)
- \(\vec{p_1}\) : 🟡의 중심좌표 (위치벡터)
- 🔴공과 🟡공이 충돌하는 그 충돌 접선의 수직방향인 벡터를
노말 벡터
라고 할 수 있다.- 충돌 접선의 수직방향이므로
노말 벡터
는 🔴중심으로부터 🟡중심까지의 벡터인 \(\vec{p_1}-\vec{p_0}\) 와 방향이 일치한다.- 두 원의 중심과 중심을 잇는 선은 충돌 전선에 수직이다.
- 이 예제에서는
노말 벡터
를 🔴중심으로부터 🟡중심까지의 벡터인 \(\vec{p_1}-\vec{p_0}\)의단위 벡터
라고 정의할 것이다.- 이를 \(\vec{n_0}\)라고 하자.
- 단위 벡터이므로 방향만을 나타내게 할 것이다.
- 충돌 접선의 수직방향이므로
- 🔴중심으로부터 🟡중심을 향하는 벡터의 방향
- \(\vec{n_0} = {\vec{p_1}-\vec{p_0}\over\vert\vec{p_1}-\vec{p_0}\vert}\)
- 🔴원이 충돌 전 향하던 방향
- \(\vert\vec{n_0}\vert=1\)
- \(\vec{n_0} = {\vec{p_1}-\vec{p_0}\over\vert\vec{p_1}-\vec{p_0}\vert}\)
- 🟡중심으로부터 🔴중심을 향하는 벡터의 방향
- \(\vec{n_1} = -\vec{n_0}\)
- 🔴원이 충돌 전 향하던 방향
- \(\vec{n_0}\) 과 방향 정반대
- \(\vert\vec{n_1}\vert=1\)
- \(\vec{n_1} = -\vec{n_0}\)
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기