Пример #1
0
    public static Boundary SurroundingBoundary(Boundary a, Boundary b)
    {
        var boundary = new Boundary();

        boundary.box = Aabb.SurroundingBox(a.box, b.box);
        return(boundary);
    }
Пример #2
0
 public MovingSphere(Vector3 center0, Vector3 center1, float t0, float t1, float r, MaterialData material) : base(center0, r, material)
 {
     center1_      = center1;
     time0_        = t0;
     time1_        = t1;
     boundary_.box = Aabb.SurroundingBox(boundary_.box, CreateAabb(center1_, radius_));
 }
Пример #3
0
        public bool BoundingBox(double t0, double t1, out Aabb outputBox)
        {
            var firstBox = true;

            outputBox = default(Aabb);

            foreach (var obj in Objects)
            {
                if (!obj.BoundingBox(t0, t1, out var output))
                {
                    return(false);
                }

                outputBox = firstBox ? output : Aabb.SurroundingBox(outputBox, output);
                firstBox  = false;
            }

            return(true);
        }
Пример #4
0
        public bool BoundingBox(double t0, double t1, out Aabb outputBox)
        {
            var c0 = CenterForTime(t0);
            var c1 = CenterForTime(t1);

            var b0 = new Aabb
            {
                Min = c0 - new Vec3(Radius, Radius, Radius),
                Max = c0 + new Vec3(Radius, Radius, Radius),
            };

            var b1 = new Aabb
            {
                Min = c1 - new Vec3(Radius, Radius, Radius),
                Max = c1 + new Vec3(Radius, Radius, Radius),
            };

            outputBox = Aabb.SurroundingBox(b0, b1);
            return(true);
        }
Пример #5
0
        public BvhNode(List <IHittable> srcObjects, int start, int end, double t0, double t1)
        {
            var min = new Vec3(MathUtils.Infinity, MathUtils.Infinity, MathUtils.Infinity);
            var max = new Vec3(-MathUtils.Infinity, -MathUtils.Infinity, -MathUtils.Infinity);

            for (var i = start; i < end; i++)
            {
                srcObjects[i].BoundingBox(t0, t1, out var box);
                if (box.Min.x < min.x)
                {
                    min.x = box.Min.x;
                }
                if (box.Min.y < min.y)
                {
                    min.y = box.Min.y;
                }
                if (box.Min.z < min.z)
                {
                    min.z = box.Min.z;
                }
                if (box.Max.x > max.x)
                {
                    max.x = box.Max.x;
                }
                if (box.Max.y > max.y)
                {
                    max.y = box.Max.y;
                }
                if (box.Max.z > max.z)
                {
                    max.z = box.Max.z;
                }
            }

            var diffs = max - min;
            var axis  = 0;

            if (diffs.y > diffs.x && diffs.y > diffs.z)
            {
                axis = 1;
            }
            if (diffs.z > diffs.x && diffs.z > diffs.y)
            {
                axis = 2;
            }

            IComparer <IHittable> comparator;

            switch (axis)
            {
            case 0: comparator = new BoxCompareX(); break;

            case 1: comparator = new BoxCompareY(); break;

            default: comparator = new BoxCompareZ(); break;
            }

            var objSpan = end - start;

            if (objSpan == 1)
            {
                Left  = srcObjects[start];
                Right = srcObjects[start];
            }
            else if (objSpan == 2)
            {
                if (comparator.Compare(srcObjects[start], srcObjects[start + 1]) < 0)
                {
                    Left  = srcObjects[start];
                    Right = srcObjects[start + 1];
                }
                else
                {
                    Left  = srcObjects[start + 1];
                    Right = srcObjects[start];
                }
            }
            else
            {
                srcObjects.Sort(start, objSpan, comparator);
                var mid = start + objSpan / 2;
                Left  = new BvhNode(srcObjects, start, mid, t0, t1);
                Right = new BvhNode(srcObjects, mid, end, t0, t1);
            }

            if (!Left.BoundingBox(t0, t1, out var boxLeft) ||
                !Right.BoundingBox(t0, t1, out var boxRight))
            {
                throw new Exception("No bounding box in BvhNode constructor");
            }
            Box = Aabb.SurroundingBox(boxLeft, boxRight);
        }