public void Start() { // Default initialization this.m_simulable = null; // Try to get simulable component from the object this.m_simulable = this.SimulableObject.GetComponent <ISimulable> (); // Check if component was found if (this.m_simulable == null) { System.Console.WriteLine("[ERROR] Couldn't find any ISimulable component"); this.m_isSimulable = false; } else { System.Console.WriteLine("[TRACE] Succesfully found ISimulable component"); this.m_isSimulable = true; } if (this.m_isSimulable) { // Initialize simulable model this.m_simulable.initialize(); // Update forces/matrices after the change this.m_simulable.updateForcesAndMatrices(); // Store current position and velocity vectors this.m_vxPre = this.m_simulable.getPositionVector(); this.m_vvPre = this.m_simulable.getVelocityVector(); } }
/// <summary> /// Performs a simulation step using Verlet integration. /// </summary> private void stepVerlet(ISimulable o) { o.updateForcesAndMatrices(); float h = TimeStep; VectorXD p = o.getPositionVector(); MatrixXD M = o.getMassMatrix(); VectorXD v = o.getVelocityVector(); VectorXD F = o.getForceVector(); VectorXD a = F / M.Diagonal(); o.fixSimulationVector(a); //float pos = 2 * data.Pos - data.PrePos + a * (TimeStep * TimeStep); //float velocity = (pos - data.PrePos) / (2 * TimeStep); VectorXD newPositions = 2 * p - m_vxPre + a * h * h; VectorXD newVelocities = (newPositions - m_vxPre) / (2 * h); o.fixSimulationVector(newVelocities); m_vxPre = p; m_vvPre = v; o.setPositionVector(newPositions); o.setVelocityVector(newVelocities); }
/// <summary> /// Performs a simulation step using Symplectic integration. /// </summary> private void stepSymplectic(ISimulable o) { o.updateForcesAndMatrices(); float h = TimeStep; VectorXD p = o.getPositionVector(); MatrixXD M = o.getMassMatrix(); VectorXD v = o.getVelocityVector(); VectorXD F = o.getForceVector(); /* * MatrixXD A = M + (h * D) + (h * h * K); * VectorXD b = ((M + h * D) * v) + h * F; * * VectorXD velocities = A.Solve (b);*/ VectorXD velocities = v + h * (F / M.Diagonal()); o.fixSimulationVector(velocities); VectorXD newPositions = p + velocities * h; o.setPositionVector(newPositions); o.setVelocityVector(velocities); }
public void Start() { int index = 0; m_objs = new List <ISimulable> (SimulableObjects.Capacity); foreach (GameObject obj in SimulableObjects) { ISimulable simobj = obj.GetComponent <ISimulable> (); if (simobj != null) { m_objs.Add(simobj); // Initialize simulable model simobj.initialize(index, this); // Retrieve pos and vel size index += simobj.getNumDof(); } } m_numdofs = index; index = 0; m_constraints = new List <Constraint> (Constraints.Capacity); foreach (GameObject obj in Constraints) { Constraint constraint = obj.GetComponent <Constraint> (); if (constraint != null) { m_constraints.Add(constraint); // Initialize constraint constraint.initialize(index, this); // Retrieve constraint size index += constraint.getSize(); } } m_numcs = index; }
/// <summary> /// Performs a simulation step using Explicit integration. /// </summary> private void stepExplicit(ISimulable o) { o.updateForcesAndMatrices(); float h = TimeStep; VectorXD p = o.getPositionVector(); MatrixXD M = o.getMassMatrix(); VectorXD v = o.getVelocityVector(); VectorXD F = o.getForceVector(); VectorXD velocities = v + h * (F / M.Diagonal()); o.fixSimulationVector(velocities); VectorXD newPositions = p + v * h; o.setPositionVector(newPositions); o.setVelocityVector(velocities); }
public void Start() { //Parse the simulable objects and initialize their state indices m_numDoFs = 0; m_objs = new List <ISimulable>(SimObjects.Capacity); foreach (GameObject obj in SimObjects) { ISimulable simobj = obj.GetComponent <ISimulable>(); if (simobj != null) { m_objs.Add(simobj); // Initialize simulable object simobj.Initialize(m_numDoFs, this, Fixers); // Retrieve pos and vel size m_numDoFs += simobj.GetNumDoFs(); } } }
public void Start() { //Parse the simulable objects and initialize their state indices m_numDoFs = 0; m_objs = new List <ISimulable>(SimObjects.Count); foreach (GameObject obj in SimObjects) { ISimulable simobj = obj.GetComponent <ISimulable>(); if (simobj != null) { m_objs.Add(simobj); // Initialize simulable object simobj.Initialize(m_numDoFs, this); // Retrieve pos and vel size m_numDoFs += simobj.GetNumDoFs(); } } //Parse the constraints m_numConstraints = 0; m_constraints = new List <IConstraint>(Constraints.Count); foreach (GameObject obj in Constraints) { IConstraint constraint = obj.GetComponent <IConstraint>(); if (constraint != null) { m_constraints.Add(constraint); // Initialize constraint constraint.Initialize(m_numConstraints, this); // Retrieve the number of constraints m_numConstraints += constraint.GetNumConstraints(); } } }
/// <summary> /// Performs a simulation step using Semi-Implicit integration. /// </summary> private void stepSemiImplicit(ISimulable o) { o.updateForcesAndMatrices(); float h = TimeStep; VectorXD p = o.getPositionVector(); MatrixXD M = o.getMassMatrix(); MatrixXD K = o.getSpringsJacobian(); MatrixXD D = o.getDampingMatrix(); VectorXD v = o.getVelocityVector(); VectorXD F = o.getForceVector(); MatrixXD A = M + (h * D) + (h * h * K); VectorXD b = ((M + h * D) * v) + h * F; VectorXD velocities = A.Solve(b); o.fixSimulationVector(velocities); VectorXD newPositions = p + velocities * h; o.setPositionVector(newPositions); o.setVelocityVector(velocities); }