Original Post
Anyone know how to figure out the exact point of intersection between a ray (origin, direction) and a plane or axis? Also, how do you find the plane equation of an axis?
Thanks in advance.
// Start = start of ray
// Dir = direction of ray (normalized)
// Normal = plane normal (normalized)
// D = Distance of plane from origin along normal (D in the plane equation)
// IntPoint = final pointof intersection
// returns true if an intersection was found, or false if not.
bool RayPlaneIntersect(const fvector3 &Start, const fvector3 &Dir, const fvector3 &Normal, float D, fvector3 *IntPoint)
{
float hd = 0;
float i = Normal * Dir; // dotproduct
if( i==0 ) return( false ); // ray is parallel to plane, no hit
float j = -(Normal * Start + D);
hd = j/i; // compute distance along ray to intersection point
if( hd < EPSILON ) return( false ); // Hit is behind start of ray, no hit
*IntPoint = Start + hd*Dir; // compute the point of intersection, using the ray equation
return( true );
};
quote:
Original post by Yann L
... and D the displacement offset from thre origin along the normal.
#define EPSILON 0.000001
#define CROSS(dest,v1,v2) \
dest[0]=v1[1]*v2[2]-v1[2]*v2[1]; \
dest[1]=v1[2]*v2[0]-v1[0]*v2[2]; \
dest[2]=v1[0]*v2[1]-v1[1]*v2[0];
#define DOT(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])
#define SUB(dest,v1,v2)
dest[0]=v1[0]-v2[0]; \
dest[1]=v1[1]-v2[1]; \
dest[2]=v1[2]-v2[2];
/*
We present a clean algorithm for determining whether a ray intersects a triangle.
The algorithm translates the origin of the ray and then changes the base to yield a vector (t u v)T, where t is the
distance to the plane in which the triangle lies and (u,v) represents the coordinates inside the triangle.
*/
int
intersect_triangle(double orig[3], double dir[3],
double vert0[3], double vert1[3], double vert2[3],
double *t, double *u, double *v)
{
double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
double det,inv_det;
/* find vectors for two edges sharing vert0 */
SUB(edge1, vert1, vert0);
SUB(edge2, vert2, vert0);
/* begin calculating determinant - also used to calculate U parameter */
CROSS(pvec, dir, edge2);
/* if determinant is near zero, ray lies in plane of triangle */
det = DOT(edge1, pvec);
#ifdef TEST_CULL /* define TEST_CULL if culling is desired */
if (det < EPSILON)
return 0;
/* calculate distance from vert0 to ray origin */
SUB(tvec, orig, vert0);
/* calculate U parameter and test bounds */
*u = DOT(tvec, pvec);
if (*u < 0.0 || *u > det)
return 0;
/* prepare to test V parameter */
CROSS(qvec, tvec, edge1);
/* calculate V parameter and test bounds */
*v = DOT(dir, qvec);
if (*v < 0.0 || *u + *v > det)
return 0;
/* calculate t, scale parameters, ray intersects triangle */
*t = DOT(edge2, qvec);
inv_det = 1.0 / det;
*t *= inv_det;
*u *= inv_det;
*v *= inv_det;
#else /* the non-culling branch */
if (det > -EPSILON && det < EPSILON)
return 0;
inv_det = 1.0 / det;
/* calculate distance from vert0 to ray origin */
SUB(tvec, orig, vert0);
/* calculate U parameter and test bounds */
*u = DOT(tvec, pvec) * inv_det;
if (*u < 0.0 || *u > 1.0)
return 0;
/* prepare to test V parameter */
CROSS(qvec, tvec, edge1);
/* calculate V parameter and test bounds */
*v = DOT(dir, qvec) * inv_det;
if (*v < 0.0 || *u + *v > 1.0)
return 0;
/* calculate t, ray intersects triangle */
*t = DOT(edge2, qvec) * inv_det;
#endif
return 1;
}
quote:
Original post by ga
Yann L: you're right, but from your first post one could think that D is always the distance from the origin to the plane![]()
This topic has been locked by a moderator. New replies are not allowed.
With your permission, GameDev.net uses analytics cookies to understand how people use the platform. You can accept analytics or continue with necessary cookies only. Learn more