Exemplo n.º 1
0
        public static bool IntersectSphereTriangle(Sphere sphere, Triangle trig, ref Geometry.Geometric_Queries.Distance_Query_Result result)
        {
            var mink_sph = new Minkowski_Description();

            mink_sph.HalfAxis    = new Vector4(sphere.Radius, sphere.Radius, sphere.Radius, 1);
            mink_sph.Position_LM = sphere.Position - trig.Bary_center;
            var sphere_from_trig = trig.What_Faces(mink_sph);



            if (sphere_from_trig.Signed_Dist > 0.0f)
            {
                return(false);
            }


            result = new Geometry.Geometric_Queries.Distance_Query_Result();
            result.first_has_normal = false;
            result.Normal_W         = trig.Normals[sphere_from_trig.Normal_Code];
            var Extreme_Point_In_Normal_Of_Body_1 = trig.Points[sphere_from_trig.Normal_Code] - Intersection_Grid.current_pair_element_2.Rigid.Position;
            var Extreme_Point_In_Normal_Of_Body_2 = -result.Normal_W * sphere.Radius;



            result.signed_distance = sphere_from_trig.Signed_Dist;
            result.double_contact  = false;
            result.Point_W_0       = Extreme_Point_In_Normal_Of_Body_2 + sphere.Position;

            return(true);
        }
Exemplo n.º 2
0
        public static Minkowski_Description Minkowskize_OBB_In_OBB(OBB obb1, OBB obb2)
        {
            var ret = new Minkowski_Description();

            var tmp = obb1.Position - obb2.Position;

            var res  = Vector3.Transform(tmp, obb2.TOrientation);
            var res2 = new Vector4();

            var axisxinnewcords = Vector3.Transform(obb1.Axis(0), obb2.TOrientation);
            var axisyinnewcords = Vector3.Transform(obb1.Axis(1), obb2.TOrientation);

            var xradius = obb1.HalfAxisWidth.X * Math.Abs(axisxinnewcords.X) + obb1.HalfAxisWidth.Y * Math.Abs(axisyinnewcords.X);
            var yradius = obb1.HalfAxisWidth.X * Math.Abs(axisxinnewcords.Y) + obb1.HalfAxisWidth.Y * Math.Abs(axisyinnewcords.Y);


            res2.X = xradius;
            res2.Y = yradius;
            res2.Z = 0;

            ret.HalfAxis    = res2;
            ret.Position_LM = res;

            return(ret);
        }
Exemplo n.º 3
0
        public static Minkowski_Description Minkowskize_Sphere_In_OBB(Sphere sph, OBB obb)
        {
            var ret = new Minkowski_Description();

            ret.HalfAxis.X  = sph.Radius;
            ret.Position_LM = obb.Point_W_To_L(sph.Position);

            return(ret);
        }
Exemplo n.º 4
0
        public static Minkowski_Description Minkowskize_Sphere_In_OBB(Sphere sph, OBB obb)
        {
            var ret = new Minkowski_Description();

            ret.HalfAxis.X = sph.Radius;
            ret.Position_LM = obb.Point_W_To_L(sph.Position);

            return ret;
        }
Exemplo n.º 5
0
 public static Minkowski_Description Minkowskize_OBB_In_Triangle(OBB obb, Triangle trig)
 {
     var ret = new Minkowski_Description();
     ret.HalfAxis.X = Math.Abs(obb.Extreme_In(trig.Normals[0]).dist_in_dir_w);
     ret.HalfAxis.Y = Math.Abs(obb.Extreme_In(trig.Normals[1]).dist_in_dir_w);
     ret.HalfAxis.Z = Math.Abs(obb.Extreme_In(trig.Normals[2]).dist_in_dir_w);
     ret.Position_LM = obb.Position - trig.Bary_center;
     return ret;
 }
Exemplo n.º 6
0
        public static Minkowski_Description Minkowskize_OBB_In_Triangle(OBB obb, Triangle trig)
        {
            var ret = new Minkowski_Description();

            ret.HalfAxis.X  = Math.Abs(obb.Extreme_In(trig.Normals[0]).dist_in_dir_w);
            ret.HalfAxis.Y  = Math.Abs(obb.Extreme_In(trig.Normals[1]).dist_in_dir_w);
            ret.HalfAxis.Z  = Math.Abs(obb.Extreme_In(trig.Normals[2]).dist_in_dir_w);
            ret.Position_LM = obb.Position - trig.Bary_center;
            return(ret);
        }
Exemplo n.º 7
0
 public static Minkowski_Description Minkowskize_Triangle_In_OBB(Triangle trig, OBB obb)
 {
     var ret = new Minkowski_Description();
     ret.HalfAxis.X = trig.Extreme_In(obb.Normal(0)).dist_in_dir_w;
     ret.HalfAxis.Y = trig.Extreme_In(obb.Normal(1)).dist_in_dir_w;
     ret.HalfAxis.Z = trig.Extreme_In(obb.Normal(2)).dist_in_dir_w;
     ret.HalfAxis.W = trig.Extreme_In(obb.Normal(3)).dist_in_dir_w;
     ret.Position_LM = obb.Point_W_To_L(trig.Bary_center);
     return ret;
 }
Exemplo n.º 8
0
        public static Minkowski_Description Minkowskize_Triangle_In_OBB(Triangle trig, OBB obb)
        {
            var ret = new Minkowski_Description();

            ret.HalfAxis.X  = trig.Extreme_In(obb.Normal(0)).dist_in_dir_w;
            ret.HalfAxis.Y  = trig.Extreme_In(obb.Normal(1)).dist_in_dir_w;
            ret.HalfAxis.Z  = trig.Extreme_In(obb.Normal(2)).dist_in_dir_w;
            ret.HalfAxis.W  = trig.Extreme_In(obb.Normal(3)).dist_in_dir_w;
            ret.Position_LM = obb.Point_W_To_L(trig.Bary_center);
            return(ret);
        }
Exemplo n.º 9
0
        public static Minkowski_Description Minkowskize_OBB_In_OBB(OBB obb1, OBB obb2)
        {
            var ret = new Minkowski_Description();

            var tmp = obb1.Position - obb2.Position;

            var res = Vector3.Transform(tmp, obb2.TOrientation);
            var res2 = new Vector4();

            var axisxinnewcords = Vector3.Transform(obb1.Axis(0), obb2.TOrientation);
            var axisyinnewcords = Vector3.Transform(obb1.Axis(1), obb2.TOrientation);

            var xradius = obb1.HalfAxisWidth.X * Math.Abs(axisxinnewcords.X) + obb1.HalfAxisWidth.Y * Math.Abs(axisyinnewcords.X);
            var yradius = obb1.HalfAxisWidth.X * Math.Abs(axisxinnewcords.Y) + obb1.HalfAxisWidth.Y * Math.Abs(axisyinnewcords.Y);

            res2.X = xradius;
            res2.Y = yradius;
            res2.Z = 0;

            ret.HalfAxis = res2;
            ret.Position_LM = res;

            return ret;
        }
Exemplo n.º 10
0
        public static bool IntersectSphereTriangle(Sphere sphere, Triangle trig, ref Geometry.Geometric_Queries.Distance_Query_Result result)
        {
            var mink_sph = new Minkowski_Description();
            mink_sph.HalfAxis = new Vector4(sphere.Radius, sphere.Radius, sphere.Radius,1);
            mink_sph.Position_LM = sphere.Position - trig.Bary_center;
            var sphere_from_trig = trig.What_Faces(mink_sph);

            if (sphere_from_trig.Signed_Dist > 0.0f) return false;

                result = new Geometry.Geometric_Queries.Distance_Query_Result();
                result.first_has_normal = false;
                result.Normal_W = trig.Normals[sphere_from_trig.Normal_Code];
                var Extreme_Point_In_Normal_Of_Body_1 = trig.Points[sphere_from_trig.Normal_Code] - Intersection_Grid.current_pair_element_2.Rigid.Position;
                var Extreme_Point_In_Normal_Of_Body_2 = -result.Normal_W * sphere.Radius;

                result.signed_distance = sphere_from_trig.Signed_Dist;
                result.double_contact=false;
                result.Point_W_0 = Extreme_Point_In_Normal_Of_Body_2 + sphere.Position;

            return true;
        }