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() 분석
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
'programming > direct3d' 카테고리의 다른 글
높이맵 ( Heightmap ) (0) | 2024.07.26 |
---|---|
directx terrain 약 2주간 업데이트 사항 (0) | 2024.07.26 |
dirextx xFile 띄우기 (0) | 2024.07.26 |
directx 지형 알파 멀티텍스쳐의 복수 사용 (0) | 2024.07.26 |
directx 지형 알파 텍스쳐 입히기 (0) | 2024.07.26 |