Beispiel #1
0
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.
}
Beispiel #2
0
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;
    }
}
Beispiel #3
0
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);
	}
	*/
}