IntersectTriangle 픽킹
programming/direct3d 2024. 7. 26. 10:14 |
LPDIRECT3DDEVICE9 객체와
Proc에서 받은 마우스 위치값 MouseX, MouseY 값과
InterSectTriangle 함수에서 사용할 PickOrigV,와 PickDirV라는 구조체 일반 변수를 넘겨준다.
void GetPickVector( LPDIRECT3DDEVICE9 pd3dDevice, WORD &MouseX, WORD &MouseY, D3DXVECTOR3 *PickOrigV,D3DXVECTOR3 *PickDirV)
{ //투영 행렬을 담을 메트릭스 객체 D3DXMATRIXA16 matProj; //현재 적용된 투영 행렬의 값을 디바이스 객체를 이용해 불러와 //matProj 메트릭스에 담아준다 pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj ); D3DXVECTOR3 v; //화면 공간 좌표에서 카메라 공간 좌표로 변환 v.x = ( ( ( 2.0f * MouseX ) / WIDTH_RES ) - 1 ) / matProj._11; v.y = -( ( ( 2.0f * MouseY ) / HEIGHT_RES ) - 1 ) / matProj._22; v.z = 1.0f; //디바이스 객체로 뷰스페이스 행렬을 받아와 역행렬을 구해준다. D3DXMATRIXA16 matView, m; pd3dDevice->GetTransform( D3DTS_VIEW, &matView ); D3DXMatrixInverse( &m, NULL, &matView ); //카메라 좌표로 변환된 구조체 변수에 뷰의 역행렬을 곱해서 //월드 공간 좌표로 변환시킨다. PickDirV->x = v.x*m._11 + v.y*m._21 + v.z*m._31; PickDirV->y = v.x*m._12 + v.y*m._22 + v.z*m._32; PickDirV->z = v.x*m._13 + v.y*m._23 + v.z*m._33; //광선의 시작점 PickOrigV->x = m._41; PickOrigV->y = m._42; PickOrigV->z = m._43; } |
GetPickVector함수에서 구한 PickOrig와 PirDir을 인자로 넘겨주고
교차판정을 위한 v0, v1, v2 버텍스를 넘겨준다.
PickOrig과 v0의 거리값 t와 v0 - v1의 비율 u, v0 - v2의 비율 v를 받을수있도록
인자로 넘겨준다.
마우스의 포인터와 교차가 일어나면 true값을
교차가 일어나지 않는다면 false값을 반환한다.
BOOL IntersectTriangle( const D3DXVECTOR3& orig,
const D3DXVECTOR3& dir, D3DXVECTOR3& v0, D3DXVECTOR3& v1, D3DXVECTOR3& v2, FLOAT* t, FLOAT* u, FLOAT* v ) { // Find vectors for two edges sharing vert0 D3DXVECTOR3 edge1 = v1 - v0; D3DXVECTOR3 edge2 = v2 - v0; // Begin calculating determinant - also used to calculate U parameter D3DXVECTOR3 pvec; D3DXVec3Cross( &pvec, &dir, &edge2 ); // If determinant is near zero, ray lies in plane of triangle FLOAT det = D3DXVec3Dot( &edge1, &pvec ); D3DXVECTOR3 tvec; if( det > 0 ) { tvec = orig - v0; } else { tvec = v0 - orig; det = -det; } if( det < 0.0001f ) return FALSE; // Calculate U parameter and test bounds *u = D3DXVec3Dot( &tvec, &pvec ); if( *u < 0.0f || *u > det ) return FALSE; // Prepare to test V parameter D3DXVECTOR3 qvec; D3DXVec3Cross( &qvec, &tvec, &edge1 ); // Calculate V parameter and test bounds *v = D3DXVec3Dot( &dir, &qvec ); if( *v < 0.0f || *u + *v > det ) return FALSE; // Calculate t, scale parameters, ray intersects triangle *t = D3DXVec3Dot( &edge2, &qvec ); FLOAT fInvDet = 1.0f / det; *t *= fInvDet; *u *= fInvDet; *v *= fInvDet; return TRUE; } |
'programming > direct3d' 카테고리의 다른 글
directx 지형 알파 멀티텍스쳐의 복수 사용 (0) | 2024.07.26 |
---|---|
directx 지형 알파 텍스쳐 입히기 (0) | 2024.07.26 |
directx 지형 수정사항 (0) | 2024.07.26 |
directx 지형 추가사항 (0) | 2024.07.26 |
다이렉트x 3d 지형 - 맵툴 (0) | 2024.07.26 |