示例#1
0
        public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec)
        {
            if (!box.Hit(ray, t_min, t_max))
            {
                return(false);
            }
            HitRecord leftRec = new HitRecord(), rightRec = new HitRecord();
            var       hit_left  = left.Hit(ray, t_min, t_max, ref leftRec);
            var       hit_right = right.Hit(ray, t_min, t_max, ref rightRec);

            if (hit_left && hit_right)
            {
                rec = leftRec.t < rightRec.t ? leftRec : rightRec;
                return(true);
            }
            if (hit_left)
            {
                rec = leftRec;
                return(true);
            }
            if (hit_right)
            {
                rec = rightRec;
                return(true);
            }
            return(false);
        }
        public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec)
        {
            var origin    = new Vector3(ray.original);
            var direction = new Vector3(ray.direction);

            origin[0]    = cos_theta * ray.original[0] - sin_theta * ray.original[2];
            origin[2]    = sin_theta * ray.original[0] + cos_theta * ray.original[2];
            direction[0] = cos_theta * ray.direction[0] - sin_theta * ray.direction[2];
            direction[2] = sin_theta * ray.direction[0] + cos_theta * ray.direction[2];
            var rotatedR = new Ray(origin, direction, ray.time);
            var r        = new HitRecord(rec);

            if (Object.Hit(rotatedR, t_min, t_max, ref rec))
            {
                var p      = new Vector3(rec.p);
                var normal = new Vector3(rec.normal);
                p[0]       = cos_theta * rec.p[0] + sin_theta * rec.p[2];
                p[2]       = -sin_theta * rec.p[0] + cos_theta * rec.p[2];
                normal[0]  = cos_theta * rec.normal[0] + sin_theta * rec.normal[2];
                normal[2]  = -sin_theta * rec.normal[0] + cos_theta * rec.normal[2];
                rec.p      = p;
                rec.normal = normal;
                return(true);
            }
            rec = r;
            return(false);
        }
 public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec)
 {
     if (!hitable.Hit(ray, t_min, t_max, ref rec))
     {
         return(false);
     }
     rec.normal = -rec.normal;
     return(true);
 }
        public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec)
        {
            var moved = new Ray(ray.original - offset, ray.direction, ray.time);

            if (!Object.Hit(moved, t_min, t_max, ref rec))
            {
                return(false);
            }
            rec.p += offset;
            return(true);
        }
        public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec)
        {
            HitRecord rec1 = new HitRecord(), rec2 = new HitRecord();

            if (boundary.Hit(ray, -float.MaxValue, float.MaxValue, ref rec1))
            {
                if (boundary.Hit(ray, rec1.t + 0.0001f, float.MaxValue, ref rec2))
                {
                    rec1.t = Mathf.Range(rec1.t, t_min, t_max);
                    if (rec1.t < t_min)
                    {
                        rec1.t = t_min;
                    }
                    if (rec2.t > t_max)
                    {
                        rec2.t = t_max;
                    }
                    if (rec1.t >= rec2.t)
                    {
                        return(false);
                    }
                    if (rec1.t < 0)
                    {
                        rec1.t = 0;
                    }
                    float distance_inside_boundary = (rec2.t - rec1.t) * ray.direction.length();

                    float hit_distance = -(1 / density) * Mathf.Log(Mathematics.Random.Get());
                    if (hit_distance < distance_inside_boundary)
                    {
                        rec.t        = rec1.t + hit_distance / ray.direction.length();
                        rec.p        = ray.GetPoint(rec.t);
                        rec.normal   = new Vector3(1, 0, 0); // arbitrary
                        rec.material = phase_function;
                        return(true);
                    }
                }
            }

            return(false);
        }