1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| float rayTriangleIntersect( const Vector3 &rayOrg, const Vector3 &rayDelta, const Vector3 &p0, const Vector3 &p1, const Vector3 &p2, float minT ){ const float kNoIntersection = 1e30f; Vector3 e1 = p1 - p0; Vector3 e2 = p2 - p1; Vector3 n = crossProduct(e1, e2); float dot = n * rayDelta; if(!(dot < 0.0f)){ return kNoIntersection; } float d = n * p0; float t = d - n * rayOrg; if(!(t <= 0.0f)){ return kNoIntersection; } if(!(t >= dot * minT)){ return kNoIntersection; } t /= dot; assert(t >= 0.0f); assert(t <= minT); Vector3 p = rayOrg + rayDelta * t; float u0, u1, u2; float v0, v1, v2; if(fabs(n.x) > fabs(n.y)){ if(fabs(n.x) > fabs(n.z)){ u0 = p.y - p0.y; u1 = p1.y - p0.y; u2 = p2.y - p0.y; v0 = p.z - p0.z; v1 = p1.z - p0.z; v2 = p2.z - p0.z; }else{ u0 = p.x - p0.x; u1 = p1.x - p0.x; u2 = p2.x - p0.x; v0 = p.y - p0.y; v1 = p1.y - p0.y; v2 = p2.y - p0.y; } }else{ if(fabs(n.y) > fabs(n.z)){ u0 = p.x - p0.x; u1 = p1.x - p0.x; u2 = p2.x - p0.x; v0 = p.z - p0.z; v1 = p1.z - p0.z; v2 = p2.z - p0.z; }else{ u0 = p.x - p0.x; u1 = p1.x - p0.x; u2 = p2.x - p0.x; v0 = p.y - p0.y; v1 = p1.y - p0.y; v2 = p2.y - p0.y; } } float temp = u1 * v2 - v1 * u2; if(!(temp != 0.0f)){ return kNoIntersection; } float alpha = (u0 * v2 - v0 * u2) * temp; if(!(alpha >= 0.0f)){ return kNoIntersection; } float beta = (u1 * v0 - v1 * u0) * temp; if(!(beta >= 0.0f)){ return kNoIntersection; } float gamma = 1.0f - alpha - beta; if(!(gamma >= 0.0f)){ return kNoIntersection; } return t; }
|