본문 바로가기

Math

Picking & Test Intersection

https://www.rastertek.com/dx11tut47.html

 

Tutorial 47: Picking

Tutorial 47: Picking In most 3D applications the user will need to click on the screen with the mouse to select or interact with one of the 3D objects in the scene. This process is usually referred to as selection or picking. This tutorial will cover how t

www.rastertek.com

위 글을 번역하고 실제 따라해 보면서 내용을 추가한 것입니다.

 


 

3D 어플리케이션에서 유저가 3D 오브젝트들을 선택하거나, 상호작용 하는 데 필요한 기눙.

2D 마우스 좌표 위치를 world space상의 Vector로 변환하는 과정을 포함한다. 이 vector는 모든 visible한 객체들과의 intersection 체크에 사용된다. 일단 3D 오브젝트가 정해지면, 테스트는 정확히 어느 폴리곤이 3D 오브젝트에서 선택되었는지도 알아내게끔 할 수도 있다.

이 튜토리얼에서는 유저가 마우스 좌클릭을 할 때마다 1개의 sphere에 ray-sphere intersection테스트를 수행한다.

 

Test Intersection function

2D 마우스 좌표를 input으로 받아, 3D 스페이스상의 vector를 형성한다. 이 벡터를 sphere와 intersection 체크하게 된다.이 벡터를 picking ray라고 한다. Picking ray는 origin과 direction 이 있는데, 이 3d 좌표 (=origin) 과 3d normal (=direction) 으로 3d 공간에 라인을 그릴 수 있고, 이 라인이 무엇과 충돌하는 지를 알 수 있다.

다른 hlsl 튜토리얼에서 vertex shader가 3d 점(=vertex) 를 받아서 3d 공간으로부터 2D 스크린으로 이동해서 픽셀로 렌더링 되는 것에 익숙할 것이다. 여기에서는 이것과 정확히 반대를 수행한다 - 2D 점을 스크린으로부터 받아 3D 공간으로 이동시킨다. 늘 하던 과정을 거꾸로 하는 것이다. 3D 점을 world 에서, view로, 그리고 projection으로 2D 점을 만드는 대신, 2D 포인트를 projection, view, world로 변환해 3D 점으로 바꿀 것이다.

과정을 거꾸로 하기 위해, 마우스 좌표를 X, Y 모두 -1~+1 범위로 이동할 것이다. 그리고 projection matrix를 사용해 screen aspect로 나눈다. 이 값을 inverse view matrix 로 곱한다. 방향을 거꾸로 할 것이기 때문에 inverse이다. 이렇게 view space의 direction vector를 얻는다. view 공간에 있는 vector의 원점을 카메라의 위치로 설정할 수도 있다.

view 공간의 origin과 direction을 구했으니, 이것들을 이제 3d world 공간으로 이동할 수 있다. 먼저 world matrix를 구한 후 sphere 위치로 이동한다. 업데이트 된 world matrix를 다시 invert 한다. (반대 방향으로 진행할 것이므로) 이 invert 된 matrix를 origin과 direction을 곱한다. 곱한 이후에 direction을 normalize 할 것이다. 이렇게 하면 3D world 공간에 direction과 origin을 얻을 수 있고, 3d 공간에 있는 다른 오브젝트들과 테스트도 할 수 있다.

이제 origin과 direction이 있으니 intersection test를 할 수 있다. 이 튜토리얼에서는 ray-sphere intersection test를 수행할 것이지만, 어떤 형태의 intersection test도 가능하다.

 

TestIntersection(mouseX, mouseY)

m_Input->IsLeftMouseButtomDown() == true 일 때만 수행한다. 인풋으로 mouseX, mouseY 좌표를 받는다.

 

 

Projection Matrix의 각 구성 요소의 의미는 아래 링크에 잘 나와 있다.

Decoding a Projection Matrix - xdPixel

 

Projection Matrix의 구조

 

 

Ray-Sphere Intersection

DirectX collision library에는 여러 타입의 Collision test 함수가 들어 있는데, Ray-sphere collision test도 그 중 하나이다.

BoundingSphere - Win32 apps

bool XM_CALLCONV Intersects( FXMVECTOR Origin, FXMVECTOR Direction, float & Dist) noexcept

Tests the BoundingSphere for intersection with a ray.

 

 

 

참고 영상 및 문서 : https://youtu.be/HFPlKQGChpE

http://kylehalladay.com/blog/tutorial/math/2013/12/24/Ray-Sphere-Intersection.html

'Math' 카테고리의 다른 글

Spline Mesh Deformation  (1) 2023.12.05