picking

programming/direct3d 2024. 7. 26. 10:23 |

 

 

우선 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

IntersectTriangle 분석

A. 기본 원리 i) 두 벡터로 만들 수 있는 삼각형 OAB가 있다. ii) 이 삼각형의 두 벡터 OA와 OB는 스칼라 u와 v에 의해 다음과 같은 벡터를 얻을 수 있다. Oa = u * OA Ob = v * OB iii) OA와 OB 사이를 지내는 벡터 OP가 있다고 하자. iv) 이 벡터 OP는 두 벡터 Oa와 Ob의 합으로 나타낼 수 있다 OP = u*OA + u*OB u와 v의 합이 1보다 작거나 같은 경우 u가 1이고, v가 0인 경우 u와 v가 각각 0.5인 경우 u가 0이고, v가 1..

jebi.tistory.com

 

 

 

Posted by mainep
: