コード例 #1
0
ファイル: AccelScene.cs プロジェクト: kwaegel/muTracer
		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);
			}
		}
コード例 #2
0
ファイル: Scene.cs プロジェクト: kwaegel/muTracer
 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;
 }
コード例 #3
0
ファイル: AccelScene.cs プロジェクト: kwaegel/muTracer
		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;
		}
コード例 #4
0
ファイル: Triangle.cs プロジェクト: kwaegel/muTracer
        // 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;
        }
コード例 #5
0
ファイル: AbstractPrimitive.cs プロジェクト: kwaegel/muTracer
        public abstract float intersects(ref Ray r, ref Vector3 collisionPoint,
			ref Vector3 surfaceNormal);