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;
}
Posted by mainep
: