コード例 #1
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);
                }
            }