MCPcopy Create free account
hub / github.com/cinder/Cinder / calcTriangleIntersection

Method calcTriangleIntersection

src/cinder/Ray.cpp:28–76  ·  view source on GitHub ↗

algorithm from "Fast, Minimum Storage Ray-Triangle Intersection"

Source from the content-addressed store, hash-verified

26
27// algorithm from "Fast, Minimum Storage Ray-Triangle Intersection"
28bool Ray::calcTriangleIntersection( const vec3 &vert0, const vec3 &vert1, const vec3 &vert2, float *result ) const
29{
30 vec3 edge1, edge2, tvec, pvec, qvec;
31 float det;
32 float u, v;
33 const float epsilon = 0.000001f;
34
35 edge1 = vert1 - vert0;
36 edge2 = vert2 - vert0;
37
38 pvec = cross( getDirection(), edge2 );
39 det = dot( edge1, pvec );
40
41#if 0 // we don't want to backface cull
42 if ( det < epsilon)
43 return false;
44 tvec = getOrigin() - vert0;
45
46 u = dot( tvec, pvec );
47 if ( ( u < 0.0f ) || ( u > det ) )
48 return false;
49
50 qvec = cross( tvec, edge1 );
51 v = dot( getDirection(), qvec );
52 if ( v < 0.0f || u + v > det )
53 return false;
54
55 *result = dot( edge2, qvec ) / det;
56 return true;
57#else
58 if( det > -epsilon && det < epsilon)
59 return false;
60
61 float inv_det = 1.0f / det;
62 tvec = getOrigin() - vert0;
63 u = dot( tvec, pvec ) * inv_det;
64 if( u < 0.0f || u > 1.0f )
65 return false;
66
67 qvec = cross( tvec, edge1 );
68
69 v = dot( getDirection(), qvec ) * inv_det;
70 if( v < 0.0f || u + v > 1.0f )
71 return 0;
72
73 *result = dot( edge2, qvec ) * inv_det;
74 return true;
75#endif
76}
77
78bool Ray::calcPlaneIntersection( const vec3 &planeOrigin, const vec3 &planeNormal, float *result ) const
79{

Callers 1

performPickingMethod · 0.80

Calls 1

dotFunction · 0.85

Tested by

no test coverage detected