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);
    }
Exemple #4
0
    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);
    }
Exemple #6
0
    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);
    }