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;
        }
Exemplo n.º 2
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;
        }