/// <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; }
/// <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; }