void ChShaft::Update(double mytime, bool update_assets) { // Update parent class too ChPhysicsItem::Update(mytime, update_assets); // Class update // TrySleeping(); // See if the body can fall asleep; if so, put it to sleeping ClampSpeed(); // Apply limits (if in speed clamping mode) to speeds. }
void ChShaft::VariablesQbSetSpeed(double step) { double old_dt = pos_dt; // from 'qb' vector, sets body speed, and updates auxiliary data pos_dt = variables.Get_qb().GetElement(0, 0); // apply limits (if in speed clamping mode) to speeds. ClampSpeed(); // Compute accel. by BDF (approximate by differentiation); if (step) { pos_dtdt = (pos_dt - old_dt) / step; } }
void CBoidObject::CalcMovement(float dt,SBoidContext &bc,bool banking) { // Calc movement with current velocity. Vec3 prevAccel(0,0,0); if(banking) { if(m_currentAccel.x != 0 && m_currentAccel.y != 0 && m_currentAccel.z != 0) prevAccel = m_currentAccel.GetNormalized(); else banking = false; } m_currentAccel = m_currentAccel*bc.fSmoothFactor + m_accel*(1.0f - bc.fSmoothFactor); Vec3 velocity = m_heading*m_speed; m_pos = m_pos + velocity*dt; velocity = velocity + m_currentAccel*dt; m_speed = velocity.GetLength(); // ClampSpeed(bc,dt); if(fabs(m_speed) > 0.0001f) { Vec3 newHeading = velocity;// * (1.0f/m_speed); // Normalized velocity vector is our heading. newHeading.NormalizeFast(); if(bc.fMaxTurnRatio) { float fHeadingSmothFactor = bc.fMaxTurnRatio * bc.fSmoothFactor; if(fHeadingSmothFactor > 1.0f) fHeadingSmothFactor = 1.0f; m_heading = newHeading*fHeadingSmothFactor + m_heading*(1.0f - fHeadingSmothFactor); } else { m_heading = newHeading; } } /* if (m_speed > bc.MaxSpeed) m_speed = bc.MaxSpeed; if (m_speed < bc.MinSpeed) m_speed = bc.MinSpeed; */ ClampSpeed(bc,dt); if(banking) { Vec3 sideDir = m_heading.Cross(Vec3(0,0,1)); if(sideDir.IsZero()) sideDir = m_heading.Cross(Vec3(0,1,0)); // Vec3 v = m_currentAccel.GetLength(); m_bankingTrg = prevAccel.Dot(sideDir.GetNormalized()); } else m_bankingTrg = 0; // Slowly go into the target banking. float bd = m_bankingTrg - m_banking; m_banking = m_banking + bd*dt*10.0f; /* if (m_pPhysics) { //pe_params_pos ppos; //ppos.pos = Vec3(m_pos); //m_pPhysics->SetParams(&ppos); //pe_action_set_velocity asv; //asv.v = m_heading*m_speed; //m_pPhysics->Action(&asv); } */ }