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); }
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); } }
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); }
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); } }
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); }
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); }
/// <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; } }
/// <summary> /// プロパティ初期化 /// </summary> protected override void InitProperties() { prop = new PrimitiveProperties(); base.InitProperties(); }
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; } }