12. RayCasting & Intersection

DV·2024년 6월 9일

DirectX_3D

목록 보기
13/13

📒RayCasting, RayTracing


📌RayCasting

광선 Ray
: 어떠한 원점과 방향을 갖는 것

광선 투사법 RayCasting
: 광선을 정해진 방향으로 쏘아 어떤 물체와 충돌하게 만드는 것

  • 두 점 사이: 광선 투사법으로 두 점 사이에 무언가가 가로막고 있는지 확인 가능
  • 두 면 사이: 광선 투사법으로 두 면 사이에 무언가가 가로막고 있는지 확인 가능
    • Ex) A에서부터 빛이 나간다고 할 때, 중간에 무언가가 막고 있어 B 표면에 그림자가 졌는지, 아니면 제대로 빛이 전달되는지 여부 등 확인

📌RayTracing

: RayCasting을 사용해서 이미지 생성하는 렌더링 방식

  • 카메라 앞에 모니터를 두고, 카메라에서 모니터의 각 픽셀마다 광선을 쏜다고 가정
  • 광선이 3D 공간에서 어떤 한 물체와 충돌했을 때,
  • 충돌 지점에서 또다른 광선을 투사시켜 그림자 유무를 확인하는 방식으로 색을 계산

📌RayCasting vs RayTracing

: 광선 투사법과 광선 추적법은 다름

[RayCasting]
View point로부터 나와 Scene 내의 Object에 도달하는 광선을 추적

  • semi-3D 기술: 2차원 맵에서 3차원의 원근감을 만드는 렌더링 기술
  • 빠른 속도: 스크린의 모든 수직선에 대해 계산만 하면 됨
    • 과거 컴퓨터의 퍼포먼스 문제로 3D 엔진을 실시간으로 실행할 수 없던 시절 사용

[RayTracing]
Object에서 나오는 빛의 광선을 추적해 렌더링

  • 3D 장면의 반사, 그림자를 지원하는 현실감있는 렌더링 기술
  • 높은 해상도와 복잡한 장면 실시간 처리

📒Ray-Triangle Intersection


: 광선 충돌 판단을 위해선 장면 내의 모든 물체의, 각 삼각메쉬마다, 광선과 충돌했는지 판단해야 함

  • Moller-Trumbore 알고리즘 등을 통해 검출 가능

📌1. 평면과 광선의 교차점 찾기

📌2. 삼각형 안의 점인지 판단하기

  • 외적
    • 들어오는 벡터의 방향에 따라 외적의 위치가 바뀜
    • 이를 이용해 내외부 판별
    • 삼각형의 한 점 v0에서 다른 점 v1을 향하는 벡터 (변 표현)와,
      v0에서 교차점 p를 향하는 벡터를 외적
    • 외적의 결과를 Normal 벡터와 내적시켜 방향 판단
  • 내적
    • 대상 벡터가 90도를 넘을 때 내적의 값이 음수가 됨
    • 내적을 이용하면 간단하게 내외부 판별
  • 삼각형의 모든 점에 대해 내부로 판별된다면 삼각형 안의 점임

📒Mouse Picking


: 카메라가 보는 화면 상에서 마우스를 클릭했을 때, 해당 픽셀의 3D World 좌표 구하기

📌Ray Setting

카메라에서 마우스의 위치로 향하는 Ray

  • Start Point: Camera Pos
  • Dir: Mouse의 Screen 좌표(ScreenSpace)를 World 좌표로 이동
    1. NDC 좌표계 변환 (ScreenSpace: uv좌표계 --> NDC좌표계)
    2. ViewSpace에서 광선의 방향정보 구해줌
    3. ViewSpace ➡️ WorldSpace 전환 (View inv matrix)

📌RayCasting

카메라에서 마우스의 위치로 향하는 World Ray를 마우스 피킹할 오브젝트의 로컬로 보냄

  • 오브젝트와 광선의 교차점 구함
  • 충돌 검사: 마우스 피킹할 오브젝트를 대상으로, 메쉬의 모든 면마다 Ray와 충돌했는지 검사

References
[1] RayTracing: 🔗github
[2] RayCasting: 🔗github
[3] Ray-Triangle Intersection: https://www.slideshare.net/wraithkim/1-249173329
[4] 삼각형 내부판단 : https://hwanggoon.tistory.com/114

0개의 댓글