[C++] 3.2.3 두 공의 충돌 : 법선 벡터

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 게임 만들기 연습 문제 패키지 강의를 듣고 정리한 필기입니다.😀
🌜 공부에 사용된 홍정모 교수님의 코드들 보러가기
🌜 [홍정모의 게임 만들기 연습 문제 패키지] 강의 들으러 가기!


Chapter 3. 게임 물리 맛보기 : 공 두 개를 충돌시켜보자

벡터, 상대 속도 등등, 해당 강의에서 다루었던 물리학적 개념들이 문과생인 나에겐 생소하고 잘 와닿지 않았던 개념이라 강의를 필기하기에 앞서 개인적으로 따로 공부하여 정리해보았다.


🔔 법선 벡터(노말 벡터)

법선 : 접선에 수직인 선

노말 벡터 or 법선 벡터 : 어떤 표면에 ‘수직’인 벡터.

평평한 한 가운데에 막대기를 꽂아둔다면 막대기땅(표면)직각으로 세워져있는 상태다. 이때 막대기땅(표면)법선 벡터라고 할 수 있다.


🔔 노말 벡터의 쓰임새

공간 상에서 평면끼리의 각

만약 땅(표면)이 기울어져 언덕이 되었다면 막대기 또한 똑같은 만큼으로 기울어질 것이다.

image

image

이처럼 법선 벡터는표면에서 90도씩 더해진 관계기 때문에 두 평면끼리 이루는 각도는 법선벡터끼리의 각도와 일치한다. 두 표면의 법선벡터끼리 각을 재거나 내적을 하면 이는 두 표면 자체끼리의 각에 대한 정보를 구하는 것이나 마찬가지다.

카메라와 오브젝트

오브젝트의 각 면의 노말벡터오브젝트로부터 카메라까지 향하는 거리 벡터내적 값을 구하면 해당 면이 카메라의 시야에 들어오는지, 즉 렌더링 해야하는지 아닌지를 판별할 수 있다.

image

  • \(\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면은 뒷부분이라고 판단되어 렌더링하지 않는다.


🔔 두 공의 충돌에서의 노말 벡터

image

  • 🔴 (빨간공)
    • \(\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_1} = -\vec{n_0}\)
      • 🔴원이 충돌 전 향하던 방향
      • \(\vec{n_0}\) 과 방향 정반대
    • \(\vert\vec{n_1}\vert=1\)

image



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

C++ games 카테고리 내 다른 글 보러가기

댓글 남기기