Code
1 //-----------------------------------------------
2 //-----------检测三角形和射线的相交性---------
3 bool CDirectXApp::Intersect(const D3DXVECTOR3& v0, const D3DXVECTOR3& v1, const D3DXVECTOR3& v2,
4 const D3DXVECTOR3& orgin, const D3DXVECTOR3& vec, float& u, float& v, float& t)
5 {
6 //判断是否为三角形并且方向向量
7 assert(vec != D3DXVECTOR3(0,0,0) &&
8 v0 != v1 && v1 != v2 && v0 != v2);
9 D3DXVECTOR3 m = v0 - v2;
10 D3DXVECTOR3 n = v1 - v2;
11 D3DXVECTOR3 negativeVec = -vec;
12 D3DXVECTOR3 tempVec;
13 D3DXVec3Cross(&tempVec, &n, &negativeVec);
14 //det 为克莱姆法则求未知数的分母
15 float det = D3DXVec3Dot(&tempVec, &m);
16
17 if (det < 1e-6f)
18 {
19 return false;
20 }
21
22 D3DXVECTOR3 VtoOrigin = orgin - v2;
23 float uB = D3DXVec3Dot(&tempVec, &VtoOrigin);
24 u = uB / det;
25 if (u<0 || u>1 )
26 {
27 return false;
28 }
29
30 D3DXVec3Cross(&tempVec, &VtoOrigin, &negativeVec);
31 float vB = D3DXVec3Dot(&m, &tempVec);
32 v = vB / det;
33 if (v<0 || u+v>1)
34 {
35 return false;
36 }
37
38 D3DXVec3Cross(&tempVec, &n, &VtoOrigin);
39 float tB = D3DXVec3Dot(&m, &tempVec);
40 t = tB / det;
41 return true;
1 //-----------------------------------------------
2 //-----------检测三角形和射线的相交性---------
3 bool CDirectXApp::Intersect(const D3DXVECTOR3& v0, const D3DXVECTOR3& v1, const D3DXVECTOR3& v2,
4 const D3DXVECTOR3& orgin, const D3DXVECTOR3& vec, float& u, float& v, float& t)
5 {
6 //判断是否为三角形并且方向向量
7 assert(vec != D3DXVECTOR3(0,0,0) &&
8 v0 != v1 && v1 != v2 && v0 != v2);
9 D3DXVECTOR3 m = v0 - v2;
10 D3DXVECTOR3 n = v1 - v2;
11 D3DXVECTOR3 negativeVec = -vec;
12 D3DXVECTOR3 tempVec;
13 D3DXVec3Cross(&tempVec, &n, &negativeVec);
14 //det 为克莱姆法则求未知数的分母
15 float det = D3DXVec3Dot(&tempVec, &m);
16
17 if (det < 1e-6f)
18 {
19 return false;
20 }
21
22 D3DXVECTOR3 VtoOrigin = orgin - v2;
23 float uB = D3DXVec3Dot(&tempVec, &VtoOrigin);
24 u = uB / det;
25 if (u<0 || u>1 )
26 {
27 return false;
28 }
29
30 D3DXVec3Cross(&tempVec, &VtoOrigin, &negativeVec);
31 float vB = D3DXVec3Dot(&m, &tempVec);
32 v = vB / det;
33 if (v<0 || u+v>1)
34 {
35 return false;
36 }
37
38 D3DXVec3Cross(&tempVec, &n, &VtoOrigin);
39 float tB = D3DXVec3Dot(&m, &tempVec);
40 t = tB / det;
41 return true;