우선 winProcedure 콜백함수에서 마우스 좌료를 얻는다
또는 API함수인 GetCursorPos함수로 window상 좌표를 받아오고
ScreenToClient함수를 사용해 Client좌표로 변형 시켜줄 수 있다.
전자는 client영역에 마우스포인터가 존재해야 좌표를 갱신하고
후자는 window상의 좌표를 변형시켜준거라 client영역을 벗어나도 좌표가 갱신된다.
-
받아온 client상의 좌표를 direct3d좌표계로 변형시켜줘야한다. 범위[ -1, 1 ]
direct3D는 왼손 좌표계를 사용한다.
여기서 y값을 보면 client는 좌상단을 원점으로 아래로 내려갈수록 y값이 증가하게된다.
때문에 상,하를 반전시켜주어야 한다.
convPos.x = 2.f * clientPos.x / backBufferWidth - 1.f
convPos.y = 1.f - 2.f * clientPos.y / backBufferHeight
convPos.z = 1.f
좌표계 변환도 해주었으니 이제 뷰 공간으로 변형시켜줘야한다.
IDirect3DDevice9::GetTransform() 함수를 이용하여 projection행렬을 얻어온다.
convPos.x /= matProj._11
convPos.y /= matProj._22
이는 d3d좌표계로 변환된 정점에 projection행렬의 역행렬을 곱해준것과 같다.
-
IDirect3DDevice9::GetTransform() 함수를 이용하여 view행렬을 얻어온다.
D3DXMatrixInverse() 함수를 이용하여 view의 역행렬을 구하면
현재 카메라의 회전행렬과 카메라의 위치를 구할수있다.
-
먼저 카메라의 위치에서 월드 공간상 마우스포인터의 위치로 향하는 방향백터를 구하기위해
D3DXVec3TransformNomal() 함수를 이용하여 matInverseView행렬을 곱해준다.
이 함수는 3차원벡터를 1x4행렬로 변환후 w원소에 0을 넣어 행렬x행렬 연산을 해준다.
이로서 월드공간상의 vPickDir을 구할 수 있다.
-
matInverseView행렬의 (4,1), (4,2), (4,3) 원소는 camera의 현재 위치를 나타낸다.
가공해 얻어낸 정보
- vPickDir
- vCameraPos
*IntersectTriangle() 분석
http://jebi.tistory.com/377