Beispiel #1
0
 public abstract RtVector LocalNormalAt(RtPoint point, Intersection hit);
 public override RtVector LocalNormalAt(RtPoint point, Intersection hit)
 {
     throw new System.NotImplementedException();
 }
        private void IntersectTrianle(TriangleGeometry triangleGeometry, IntersectionList intersections, Ray ray)
        {
            var vertex1 = _vertices[triangleGeometry.Vertex1 - 1];
            var vertex2 = _vertices[triangleGeometry.Vertex2 - 1];
            var vertex3 = _vertices[triangleGeometry.Vertex3 - 1];

            var edge1 = vertex2 - vertex1;
            var edge2 = vertex3 - vertex1;

            var directionCrossEdge2 = ray.Direction.Cross(edge2);
            var determinant         = edge1.Dot(directionCrossEdge2);

            if (Math.Abs(determinant) < DoubleExtensions.EPSILON)
            {
                return;
            }

            var f = 1.0 / determinant;
            var point1ToOrigin = ray.Origin - vertex1;
            var u = f * point1ToOrigin.Dot(directionCrossEdge2);

            if (u < 0 || u > 1)
            {
                return;
            }

            var originCrossEdge1 = point1ToOrigin.Cross(edge1);
            var v = f * ray.Direction.Dot(originCrossEdge1);

            if (v < 0 || (u + v) > 1)
            {
                return;
            }


            var t = f * edge2.Dot(originCrossEdge1);

            Triangle triangle;

            if (_normals.Count > 0)
            {
                var normal1 = _normals[triangleGeometry.Normal1 - 1];
                var normal2 = _normals[triangleGeometry.Normal2 - 1];
                var normal3 = _normals[triangleGeometry.Normal3 - 1];

                triangle = new Triangle(vertex1, vertex2, vertex3, normal1, normal2, normal3);
            }
            else
            {
                triangle = new Triangle(vertex1, vertex2, vertex3);
            }

            triangle.Parent          = this;
            triangle.InheritMaterial = true;

            var intersection = new Intersection
            {
                Shape = triangle,
                Time  = t,
                U     = u,
                V     = v
            };

            intersections.Add(intersection);
        }
Beispiel #4
0
 public void Add(Intersection intersection)
 {
     _intersections.Add(intersection);
     _sorted = false;
 }