コード例 #1
0
        static public RaycastHit CastGetHit(this Ray item, float max_distance = float.PositiveInfinity, int layer_mask = IntBits.ALL_BITS)
        {
            RaycastHit hit;

            item.Cast(out hit, max_distance, layer_mask);
            return(hit);
        }
コード例 #2
0
            public void Cast(Vector3 dir, float angle, float dist)
            {
                Reset();
                if (VSL.refT == null)
                {
                    return;
                }
                //cast the rays
                var side     = Vector3.Cross(VSL.Physics.Up, dir) * VSL.Geometry.R * 1.5f;
                var cast_dir = Quaternion.AngleAxis(angle, side) * dir;

                Valid |= L.Cast(VSL.Physics.wCoM - side, cast_dir, dist, VSL.Geometry.R);
                Valid |= C.Cast(VSL.Physics.wCoM, cast_dir, dist, VSL.Geometry.R);
                Valid |= R.Cast(VSL.Physics.wCoM + side, cast_dir, dist, VSL.Geometry.R);
                if (Valid)
                {
                    L.ClaculateAltitude(dir, angle);
                    C.ClaculateAltitude(dir, angle);
                    R.ClaculateAltitude(dir, angle);
                    Altitude = VSL.Altitude.Absolute - Mathf.Min(L.Altitude, C.Altitude, R.Altitude);
                    Ray ray;
                    if (L.Valid && !R.Valid)
                    {
                        ray = L; Maneuver = ManeuverType.Horizontal;
                    }
                    else if (!L.Valid && R.Valid)
                    {
                        ray = R; Maneuver = ManeuverType.Horizontal;
                    }
                    else if (C.Valid)
                    {
                        ray = C; Maneuver = ManeuverType.Vertical;
                    }
                    else if (L.Valid && R.Valid)
                    {
                        ray = R.Distance < L.Distance? R : L; Maneuver = ManeuverType.Vertical;
                    }
                    else
                    {
                        VSL.Log("Unknown ManevuerType of a Valid Sweep. This should never happen."); return;
                    }
                    Obstacle = new TerrainPoint(Altitude, ray.CollisionPoint);
                }
            }
コード例 #3
0
ファイル: Ray.test.cs プロジェクト: qkmaxware/Geometry
        public void TestCast()
        {
            Ray ray1 = new Ray(Vec3.Zero, Vec3.K);  // Ray pointing up
            Ray ray2 = new Ray(Vec3.Zero, -Vec3.K); // Ray pointing down

            //Triangle floating above the rays
            Triangle tri = new Triangle(
                new Vec3(-1, -1, 1),
                new Vec3(0, 1, 1),
                new Vec3(1, -1, 1)
                );

            Vec3 hit1;
            Vec3 hit2;

            Assert.AreEqual(true, ray1.Cast(tri, out hit1));
            Assert.AreEqual(new Vec3(0, 0, 1), hit1);
            Assert.AreEqual(false, ray2.Cast(tri, out hit2));
        }
コード例 #4
0
        public Color RenderPixel(int x, int y)
        {
            var pixelPosition            = new Vector3D(x, y, 0);
            var transformedPixelPosition = _scene.Camera.Transform.TransformationMatrix.TransformVector(pixelPosition);

            Ray pixelRay = new Ray(transformedPixelPosition, _scene.Camera.Transform.Forward, _length);

            pixelRay.Cast(_scene);

            if (pixelRay.CollisionVectors.Count == 1)
            {
                return(Colors.Black);
            }
            else if (pixelRay.CollisionVectors.Count > 1)
            {
                return(_ambientColor);
            }
            //TODO: Add more color logics
            return(_ambientColor);
        }