Esempio n. 1
0
        protected Vector3 SetMass(float mass)
        {
            PrimitiveProperties primitiveProperties = new PrimitiveProperties(PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Density, mass);

            collision.GetMassProperties(primitiveProperties, out junk, out com, out it, out itCoM);
            body.BodyInertia = itCoM;
            body.Mass        = junk;

            return(com);
        }
Esempio n. 2
0
        public Vector3 SetMass(float mass)
        {
            PrimitiveProperties primitiveProperties =
                new PrimitiveProperties(PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Density, mass);

            float junk; Vector3 com; Matrix it, itCoM;

            collision.GetMassProperties(primitiveProperties, out junk, out com, out it, out itCoM);
            body.BodyInertia = itCoM;
            body.Mass        = junk;
            centerOfMass     = com;

            return(com);
        }
        public void PrimitivePropertiesClassTest()
        {
            PrimitiveProperties obj1 = new PrimitiveProperties();

            obj1.Setup();

            byte[] bytes = _serializer.Serialize(obj1);
            obj1.ClearStatic();
            PrimitiveProperties obj2 = _serializer.Deserialize <PrimitiveProperties>(bytes);

            if (!_compare.Compare(obj1, obj2))
            {
                throw new Exception(_compare.DifferencesString);
            }
        }
Esempio n. 4
0
        internal Vector3 SetMass(float mass)
        {
            PrimitiveProperties primitiveProperties = new PrimitiveProperties(
                PrimitiveProperties.MassDistributionEnum.Solid,
                PrimitiveProperties.MassTypeEnum.Mass,
                mass);

            float   oMass;
            Vector3 com = new Vector3();
            Matrix  it, itCom;

            Skin.GetMassProperties(primitiveProperties, out oMass, out com, out it, out itCom);
            body.BodyInertia = itCom;
            body.Mass        = oMass;

            return(com);
        }
Esempio n. 5
0
        private Vector3 ApplyMass(float mass)
        {
            float   junk;
            Vector3 com;

            Microsoft.Xna.Framework.Matrix it;
            Microsoft.Xna.Framework.Matrix itCoM;

            var primitiveProperties = new PrimitiveProperties(PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Mass, mass);

            collisionSkin.GetMassProperties(primitiveProperties, out junk, out com, out it, out itCoM);

            PhysicsBody.BodyInertia = itCoM;
            PhysicsBody.Mass        = junk;

            return(com);
        }
        public void PrimitivePropertiesListTest()
        {
            List <PrimitiveProperties> list1 = new List <PrimitiveProperties>();

            PrimitiveProperties obj1 = new PrimitiveProperties();

            obj1.Setup();
            list1.Add(obj1);

            byte[] bytes = _serializer.Serialize(list1);
            obj1.ClearStatic();
            List <PrimitiveProperties> list2 = _serializer.Deserialize <List <PrimitiveProperties> >(bytes);

            if (!_compare.Compare(list1, list2))
            {
                throw new Exception(_compare.DifferencesString);
            }
        }
Esempio n. 7
0
        private Vector3 SetMass(float mass)
        {
            PrimitiveProperties primitiveProperties = new PrimitiveProperties(
                PrimitiveProperties.MassDistributionEnum.Solid,
                PrimitiveProperties.MassTypeEnum.Mass, mass);

            float   junk;
            Vector3 com;
            Matrix  it;
            Matrix  itCoM;

            Skin.GetMassProperties(primitiveProperties, out junk, out com, out it, out itCoM);

            Body.BodyInertia = itCoM;
            Body.Mass        = junk;

            return(com);
        }
Esempio n. 8
0
        private static Vector3 SetMass(float mass, CollisionSkin skin, Body body)
        {
            PrimitiveProperties primitiveProperties = new PrimitiveProperties(
                PrimitiveProperties.MassDistributionEnum.Solid,
                PrimitiveProperties.MassTypeEnum.Mass, mass);

            float   junk;
            Vector3 com;
            Matrix4 it;
            Matrix4 itCoM;

            skin.GetMassProperties(primitiveProperties, out junk, out com, out it, out itCoM);

            body.BodyInertia = itCoM;
            body.Mass        = junk;

            return(com);
        }
Esempio n. 9
0
        /// <summary>
        /// Helper to calculate the combined mass, centre of mass, and
        /// inertia tensor about the origin and the CoM (for the local
        /// primitives) primitiveProperties indicates the properties used
        /// for all primitives - so the mass is the total mass
        /// </summary>
        /// <param name="primitiveProperties"></param>
        /// <param name="mass"></param>
        /// <param name="centerOfMass"></param>
        /// <param name="inertiaTensor"></param>
        /// <param name="inertiaTensorCoM"></param>
        public void GetMassProperties(PrimitiveProperties primitiveProperties,
                                      out float mass, out Vector3 centerOfMass, out Matrix4 inertiaTensor, out Matrix4 inertiaTensorCoM)
        {
            mass          = 0.0f;
            centerOfMass  = Vector3.Zero;
            inertiaTensor = new Matrix4();

            float totalWeighting = 0.0f;

            if (primitiveProperties.MassType == PrimitiveProperties.MassTypeEnum.Mass)
            {
                for (int prim = primitivesLocal.Count; prim-- != 0;)
                {
                    if (primitiveProperties.MassDistribution == PrimitiveProperties.MassDistributionEnum.Solid)
                    {
                        totalWeighting += primitivesLocal[prim].GetVolume();
                    }
                    else
                    {
                        totalWeighting += primitivesLocal[prim].GetSurfaceArea();
                    }
                }
            }

            for (int prim = primitivesLocal.Count; prim-- != 0;)
            {
                float m; Vector3 com; Matrix4 it;

                PrimitiveProperties primProperties = primitiveProperties;

                if (primitiveProperties.MassType == PrimitiveProperties.MassTypeEnum.Mass)
                {
                    float weighting = 0.0f;
                    if (primitiveProperties.MassDistribution == PrimitiveProperties.MassDistributionEnum.Solid)
                    {
                        weighting = primitivesLocal[prim].GetVolume();
                    }
                    else
                    {
                        weighting = primitivesLocal[prim].GetSurfaceArea();
                    }
                    primProperties.MassOrDensity *= weighting / totalWeighting;
                }

                primitivesLocal[prim].GetMassProperties(primProperties, out m, out com, out it);

                mass         += m;
                centerOfMass += m * com;
                inertiaTensor = Matrix4Extensions.Add(inertiaTensor, it);
            }

            inertiaTensorCoM = Matrix4.Identity;

            if (mass > 0.0f)
            {
                centerOfMass /= mass;

                // Transfer of axe theorem
                inertiaTensorCoM.M11 = inertiaTensor.M11 - mass * (centerOfMass.Y * centerOfMass.Y + centerOfMass.Z * centerOfMass.Z);
                inertiaTensorCoM.M22 = inertiaTensor.M22 - mass * (centerOfMass.Z * centerOfMass.Z + centerOfMass.X * centerOfMass.X);
                inertiaTensorCoM.M33 = inertiaTensor.M33 - mass * (centerOfMass.X * centerOfMass.X + centerOfMass.Y * centerOfMass.Y);

                // CHECK THIS. seems strange for me
                inertiaTensorCoM.M12 = inertiaTensorCoM.M21 = inertiaTensor.M12 + mass * centerOfMass.X * centerOfMass.Y;
                inertiaTensorCoM.M23 = inertiaTensorCoM.M32 = inertiaTensor.M23 + mass * centerOfMass.Y * centerOfMass.Z;
                inertiaTensorCoM.M31 = inertiaTensorCoM.M13 = inertiaTensor.M31 + mass * centerOfMass.Z * centerOfMass.X;
            }

            if (primitiveProperties.MassType == PrimitiveProperties.MassTypeEnum.Mass)
            {
                mass = primitiveProperties.MassOrDensity;
            }
        }
Esempio n. 10
0
 /// <summary>
 /// プロパティ初期化
 /// </summary>
 protected override void InitProperties()
 {
     prop = new PrimitiveProperties();
     base.InitProperties();
 }
Esempio n. 11
0
        public void GetMassProperties(PrimitiveProperties primitiveProperties, out float mass, out Vector3 centerOfMass, out Matrix inertiaTensor, out Matrix inertiaTensorCoM)
        {
            mass          = 0.0f;
            centerOfMass  = Vector3.Zero;
            inertiaTensor = new Matrix();

            var totalWeighting = 0.0f;

            if (primitiveProperties.MassType == PrimitiveProperties.MassTypeEnum.Mass)
            {
                for (var prim = primitivesLocal.Count; prim-- != 0;)
                {
                    if (primitiveProperties.MassDistribution == PrimitiveProperties.MassDistributionEnum.Solid)
                    {
                        totalWeighting += primitivesLocal[prim].GetVolume();
                    }
                    else
                    {
                        totalWeighting += primitivesLocal[prim].GetSurfaceArea();
                    }
                }
            }

            for (var prim = primitivesLocal.Count; prim-- != 0;)
            {
                var primProperties = primitiveProperties;

                if (primitiveProperties.MassType == PrimitiveProperties.MassTypeEnum.Mass)
                {
                    var weighting = 0.0f;
                    if (primitiveProperties.MassDistribution == PrimitiveProperties.MassDistributionEnum.Solid)
                    {
                        weighting = primitivesLocal[prim].GetVolume();
                    }
                    else
                    {
                        weighting = primitivesLocal[prim].GetSurfaceArea();
                    }
                    primProperties.MassOrDensity *= weighting / totalWeighting;
                }

                primitivesLocal[prim].GetMassProperties(primProperties, out var m, out var com, out var it);

                mass          += m;
                centerOfMass  += m * com;
                inertiaTensor += it;
            }

            inertiaTensorCoM = Matrix.Identity;

            if (mass > 0.0f)
            {
                centerOfMass /= mass;


                inertiaTensorCoM.M11 = inertiaTensor.M11 - mass * (centerOfMass.Y * centerOfMass.Y + centerOfMass.Z * centerOfMass.Z);
                inertiaTensorCoM.M22 = inertiaTensor.M22 - mass * (centerOfMass.Z * centerOfMass.Z + centerOfMass.X * centerOfMass.X);
                inertiaTensorCoM.M33 = inertiaTensor.M33 - mass * (centerOfMass.X * centerOfMass.X + centerOfMass.Y * centerOfMass.Y);


                inertiaTensorCoM.M12 = inertiaTensorCoM.M21 = inertiaTensor.M12 + mass * centerOfMass.X * centerOfMass.Y;
                inertiaTensorCoM.M23 = inertiaTensorCoM.M32 = inertiaTensor.M23 + mass * centerOfMass.Y * centerOfMass.Z;
                inertiaTensorCoM.M31 = inertiaTensorCoM.M13 = inertiaTensor.M31 + mass * centerOfMass.Z * centerOfMass.X;
            }

            if (primitiveProperties.MassType == PrimitiveProperties.MassTypeEnum.Mass)
            {
                mass = primitiveProperties.MassOrDensity;
            }
        }