public override float getNearestIntersection(ref Ray ray, ref Vector3 collisionPoint, ref Vector3 surfaceNormal) { if(UseTree) { Sphere primHit; _tree.PrintDebugMessages = PrintDebugMessages; return _tree.getNearestIntersection(ref ray, out primHit); } else { return base.getNearestIntersection(ref ray, ref collisionPoint, ref surfaceNormal); } }
public virtual float getNearestIntersection(ref Ray r, ref Vector3 collisionPoint, ref Vector3 surfaceNormal) { float nearestIntersection = float.PositiveInfinity; foreach (Sphere s in _spheres) { float intersection = r.intersects(s, ref collisionPoint, ref surfaceNormal); if (intersection < nearestIntersection) { nearestIntersection = intersection; } } return nearestIntersection; }
public override float getNearestIntersection(ref Ray ray, ref Vector3 collisionPoint, ref Vector3 surfaceNormal, ref Material mat) { // Use KD-Tree to check for intersection Sphere primHit; float t = _tree.getNearestIntersection(ref ray, out primHit); if ( !float.IsPositiveInfinity(t) ) { ray.Direction.Normalize(); collisionPoint = ray.Origin + (Vector3)(t * ray.Direction); surfaceNormal = Vector3.Subtract(collisionPoint, primHit.Position); surfaceNormal.Normalize(); collisionPoint = primHit.Position + primHit.Radius * surfaceNormal; mat = primHit.Material; } return t; }
// Code from: http://web.archive.org/web/20040629174917/http://www.acm.org/jgt/papers/MollerTrumbore97/code.html public float rayTriIntersect(Ray ray) { float EPSILON = 10e-5f; Vector3 dir = ray.Direction; Vector3 orig = ray.Origin; Vector3 vert0 = new Vector3(p0); Vector3 vert1 = new Vector3(p1); Vector3 vert2 = new Vector3(p2); //double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3]; //double det,inv_det; /* find vectors for two edges sharing vert0 */ Vector3 edge1 = vert1 - vert0; //SUB(edge1, vert1, vert0); Vector3 edge2 = vert2 - vert0; //SUB(edge2, vert2, vert0); /* begin calculating determinant - also used to calculate U parameter */ Vector3 pvec = Vector3.Cross(dir, edge2); //CROSS(pvec, dir, edge2); /* if determinant is near zero, ray lies in plane of triangle */ float det = Vector3.Dot(edge1, pvec); //det = DOT(edge1, pvec); if (det > -EPSILON && det < EPSILON) return 0; float inv_det = 1.0f / det; /* calculate distance from vert0 to ray origin */ Vector3 tvec = orig - vert0; //SUB(tvec, orig, vert0); /* calculate U parameter and test bounds */ float u = Vector3.Dot(tvec, pvec) * inv_det; //*u = DOT(tvec, pvec) * inv_det; if (u < 0.0 || u > 1.0) return 0; /* prepare to test V parameter */ Vector3 qvec = Vector3.Cross(tvec, edge1); //CROSS(qvec, tvec, edge1); /* calculate V parameter and test bounds */ float v = Vector3.Dot(dir, qvec) * inv_det; //*v = DOT(dir, qvec) * inv_det; if (v < 0.0 || u + v > 1.0) return 0; /* calculate t, ray intersects triangle */ float t = Vector3.Dot(edge2, qvec) * inv_det; //*t = DOT(edge2, qvec) * inv_det; Vector3 collisionPoint = ray.Origin + t * ray.Direction; Vector3 surfaceNormal = Vector3.Cross(edge1, edge2); surfaceNormal.Normalize(); return t; }
public abstract float intersects(ref Ray r, ref Vector3 collisionPoint, ref Vector3 surfaceNormal);