public SimulationObject( ObjectType type, ObjectGeometry[] geometry, double[] mass, Vector3[] startCompositePosition, Vector3 position, Quaternion rotationStatus) { ObjectType = type; ObjectGeometry = geometry; PartialMass = new double[geometry.Length]; Array.Copy(mass, PartialMass, geometry.Length); for (int i = 0; i < geometry.Length; i++) Mass += mass[i]; if (ObjectType == ObjectType.StaticRigidBody) { Mass = 0.0; InverseMass = 0.0; } else if (Mass > 0.0) InverseMass = 1.0 / Mass; RotationStatus = rotationStatus; StartCompositePositionObjects = startCompositePosition; SetObjectProperties(); Position = position; SetAABB(); SleepingFrameCount = 0; }
public SimulationObject[] LoadSimulationObjects() { var xmlDoc = new XmlDocument(); xmlDoc.Load(FileNameObjectProperties); XmlNodeList xmlList = xmlDoc.SelectNodes(nodePathObjects); SimulationObject[] objects = new SimulationObject[xmlList.Count]; for (int i = 0; i < xmlList.Count; i++) { //Rotation Status var versor = new Vector3( Convert.ToDouble(xmlList[i][rotationStatusAttribute].Attributes["x"].Value), Convert.ToDouble(xmlList[i][rotationStatusAttribute].Attributes["y"].Value), Convert.ToDouble(xmlList[i][rotationStatusAttribute].Attributes["z"].Value)); double angle = Convert.ToDouble(xmlList[i][rotationStatusAttribute].Attributes["angle"].Value); //Position var position = new Vector3( Convert.ToDouble(xmlList[i][positionAttribute].Attributes["x"].Value), Convert.ToDouble(xmlList[i][positionAttribute].Attributes["y"].Value), Convert.ToDouble(xmlList[i][positionAttribute].Attributes["z"].Value)); XmlNodeList xmlGeometryList = xmlList[i].SelectNodes(nodePathGeometry); ObjectGeometry[] objGeometry = new ObjectGeometry[xmlGeometryList.Count]; double[] mass = new double[xmlGeometryList.Count]; Vector3[] startCompositePosition = new Vector3[xmlGeometryList.Count]; for (int j = 0; j < xmlGeometryList.Count; j++) { //Scale float scale = Convert.ToSingle(xmlGeometryList[j][scaleAttribute].InnerText); //Object geometry file name string geometryFileName = xmlGeometryList[j][objectGeometryAttribute].InnerText; //Object mass mass[j] = Convert.ToDouble(xmlGeometryList[j][massAttribute].InnerText); objGeometry[j] = GetObjectGeometry(geometryFileName, scale); startCompositePosition[j] = new Vector3( Convert.ToDouble(xmlGeometryList[j][compositePosition].Attributes["x"].Value), Convert.ToDouble(xmlGeometryList[j][compositePosition].Attributes["y"].Value), Convert.ToDouble(xmlGeometryList[j][compositePosition].Attributes["z"].Value)); } if (xmlGeometryList.Count > 1) { objects[i] = new SimulationObject( (ObjectType)Convert.ToInt32(xmlList[i][objectType].InnerText), objGeometry, mass, startCompositePosition, position, new Quaternion(versor, angle)); } else { objects[i] = new SimulationObject( (ObjectType)Convert.ToInt32(xmlList[i][objectType].InnerText), objGeometry[0], mass[0], position, new Quaternion(versor, angle)); } //Linear Velocity objects [i].SetLinearVelocity (new Vector3 ( Convert.ToDouble (xmlList [i] [linearVelAttribute].Attributes ["x"].Value), Convert.ToDouble (xmlList [i] [linearVelAttribute].Attributes ["y"].Value), Convert.ToDouble (xmlList [i] [linearVelAttribute].Attributes ["z"].Value))); //Angular Velocity objects [i].SetAngularVelocity (new Vector3 ( Convert.ToDouble (xmlList [i] [angularVelAttribute].Attributes ["x"].Value), Convert.ToDouble (xmlList [i] [angularVelAttribute].Attributes ["y"].Value), Convert.ToDouble (xmlList [i] [angularVelAttribute].Attributes ["z"].Value))); //Restitution Coefficient objects [i].SetRestitutionCoeff (Convert.ToDouble (xmlList [i] [restitutionCoeffAttribute].InnerText)); //Dynamic friction objects[i].SetDynamicFrictionCoeff (Convert.ToDouble(xmlList [i][dynamicFrictionAttribute].InnerText)); //Static friction objects [i].SetStaticFrictionCoeff (Convert.ToDouble (xmlList [i] [staticFrictionAttribute].InnerText)); //Collision detection objects[i].SetExcludeFromCollisionDetection (Convert.ToBoolean(xmlList [i] [excludeFromCollisionDetection].InnerText)); //Baumgarte Stabilization value objects[i].SetBaumgarteStabilizationCoeff(30.0); } return objects; }
//TODO Refactoring costruttori(inserire possibilità di creeare oggetti con centro di massa e inertia tensor prestabiliti) public SimulationObject( ObjectType type, ObjectGeometry geometry, double mass, Vector3 position, Quaternion rotationStatus) { ObjectType = type; ObjectGeometry = new ObjectGeometry[1] { geometry }; PartialMass = new double[1] { mass }; Mass = mass; if (ObjectType == ObjectType.StaticRigidBody) { Mass = 0.0; InverseMass = 0.0; } else if (Mass > 0.0) InverseMass = 1.0 / Mass; StartCompositePositionObjects = new Vector3[1]; RotationStatus = rotationStatus; Position = position; SetObjectProperties(); SetAABB(); SleepingFrameCount = 0; }