Esempio n. 1
0
        /// <summary>
        /// Vytvoří těleso s danou geometrií,hmotností a materiálem
        /// </summary>
        /// <param name="ObjectModel">Model tělesa</param>
        /// <param name="ObjectMass">Hmotnost tělesa</param>
        /// <param name="ObjectMaterial">Materiál tělesa</param>
        public SimObject(Geometry ObjectModel, double ObjectMass, Material ObjectMaterial)
        {
            if (!ObjectModel.GetType().Attributes.HasFlag(System.Reflection.TypeAttributes.Serializable))
                throw new ArgumentException();

            model = ObjectModel;
            Mass = ObjectMass;
            ObjMaterial = ObjectMaterial;

            totalForce = Vector.Zero;
            totalTorque = Vector.Zero;
            LinearVelocity = Vector.Zero;
            AngularVelocity = Vector.Zero;

            Enabled = true;
            NoTranslations = false;
            Static = false;

            double denom = 0,num = 0,factor = 0;
            for (int i = 0, j = 0; i < Model.ObjectGeometry.Length; i++)
            {
                j = (i + 1) % Model.ObjectGeometry.Length;
                factor = Vector.Pow((Vector)Model.ObjectGeometry[j], 2) + Vector.Dot((Vector)Model.ObjectGeometry[j], (Vector)Model.ObjectGeometry[i]) + Vector.Pow((Vector)Model.ObjectGeometry[i], 2);
                num += Vector.Cross(((Vector)Model.ObjectGeometry[j]), ((Vector)Model.ObjectGeometry[i])).Magnitude * factor;
                denom += Vector.Cross(((Vector)Model.ObjectGeometry[j]), ((Vector)Model.ObjectGeometry[i])).Magnitude;

            }
            J = num / denom;
        }
Esempio n. 2
0
        /// <summary>
        /// Zjistí, zda je jedno těleso od druhého odděleno danou osou
        /// </summary>
        /// <param name="Axis">Osa oddělení</param>
        /// <param name="ObjectA">Objekt A</param>
        /// <param name="ObjectB">Objekt B</param>
        /// <param name="MTD">Minimální vektor oddělení</param>
        /// <returns>True pokud je odděleno, False pokud nikoliv</returns>
        public static bool SeparatedByAxis(Vector Axis, Geometry ObjectA, Geometry ObjectB,ref Vector MTD)
        {
            double minA = 0, maxA = 0, minB = 0, maxB = 0;
            ObjectA.ProjectToAxis(Axis, ref minA, ref maxA);
            ObjectB.ProjectToAxis(Axis, ref minB, ref maxB);

            double d0 = (maxB - minA);
            double d1 = (minB - maxA);

            if(d0 < 0.0f || d1 > 0.0f) return true;

            double overlap = (d0 < -d1) ? d0 : d1;

            Vector Sep = Axis * (overlap / Vector.Pow(Axis, 2));

            if (MTD == null || MTD.IsNull || Sep.Magnitude < MTD.Magnitude)
                MTD = Sep;

            return false;
        }