|
|
发表于 2005-11-2 09:43:00
|
显示全部楼层
Re:射线与三角行
BOOL IntersectTriangle( const D3DXVECTOR3& orig,
const D3DXVECTOR3& dir, D3DXVECTOR3& v0,
D3DXVECTOR3& v1, D3DXVECTOR3& v2,
FLOAT* t, FLOAT* u, FLOAT* v ,D3DXVECTOR3 *pOut=NULL)
{
// 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;
// 求交点
D3DXVECTOR3 t_normal;
D3DXVec3Cross( &t_normal, &edge1, &edge2 );//求法线
D3DXVec3Normalize(&t_normal,&t_normal);//正规化
float t_a=t_normal.x;
float t_b=t_normal.y;
float t_c=t_normal.z;
float t_d=-D3DXVec3Dot(&t_normal,&v1);//求平面方程
D3DXVECTOR3 t_dir;
D3DXVec3Normalize(&t_dir,&dir);
float t_t=(t_d-D3DXVec3Dot(&t_normal,&orig))/D3DXVec3Dot(&t_normal,&t_dir);//p=s+t*v;求t
D3DXVECTOR3 t_point=orig+t_t*t_dir;
if(pOut)*pOut=t_point;
/*char t_char[255];
sprintf(t_char,"x:%f,y:%f,z:%f\n",t_point.x,t_point.y,t_point.z);
OutputDebugString(t_char);*/
return TRUE;
} |
|