当前位置: 首页>>代码示例>>C++>>正文


C++ Pose::axisX方法代码示例

本文整理汇总了C++中Pose::axisX方法的典型用法代码示例。如果您正苦于以下问题:C++ Pose::axisX方法的具体用法?C++ Pose::axisX怎么用?C++ Pose::axisX使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Pose的用法示例。


在下文中一共展示了Pose::axisX方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: pathDirection

void VO2Controller::update(float dt)
{
	updatePath(dt);
	updateObstacles(0);

	float maxVelocity = mover->getMaxVelocity(0);
	// Определяем, как далеко осталось до ближайшего вейпоинта и 
	// выбираем соответствующую стратегию движения
	//Pose::vec targetDir = this->pathDirection();
	//float distance=targetDir.length();
	//const float targetCloseFactor = 0.2f;
	//vec2f size = mover->getUnit()->getOOBB().size();
	//float sphereSize=1.3 * mover->getUnit()->getBoundingSphere().radius;
	float turningSpeed = mover->getMaxVelocity(1);
	float turningRadius = maxVelocity / turningSpeed;
	Pose moverPose = mover->getGlobalPose();
	Pose::vec velocity = Pose::vec::zero();
	Pose::vec preferedDirection = Pose::vec::zero();
	
	float preferedAngle = 0;
	float preferedSpeed = 0;
	bool findMax = true;
	bool turnOnly = false;
	if( pathCurrent != -1 )
	{
		Pose::vec pathDir = pathDirection();
		Pose::vec targ = targetScale * pathDir;
		Pose::vec path = pathErrorScale * pathError();

		if( fabs( pathDir[0] ) < 2 * turningRadius && fabs( pathDir[1] ) < 2*turningRadius)
		{
			float x = pathDir & moverPose.axisX();
			float y = fabs(pathDir & moverPose.axisY()) - turningRadius;
			turnOnly = ( x*x  + y*y < turningRadius*turningRadius );
		}

		preferedDirection = normalise(path + targ);
		preferedAngle = atan2(preferedDirection[1], preferedDirection[0]);	// а не пойти ли нам вон туда
		preferedSpeed = maxVelocity;										// и побыстрее
		MoverVehicle * mv = (MoverVehicle*)mover;
		if(mv->definition->kinematic)
		{
			Pose::vec bodyVelocityLinear = conv(mover->getBody()->GetLinearVelocity());
			float bodyVelocityAngular = mover->getBody()->GetAngularVelocity();
			/*
			velProj = (vel & pathDir) / |pathDir|
			time = |pathDir| / |velProj| = |pathDir| * |pathDir| / (vel & pathDir)
			*/
			//float distanceLeft = bodyVelocityLinear & pathDir.normalise();
			/*
			float arriveTime = pathDir.length_squared() / (bodyVelocityLinear & pathDir);
			float brakeTime = bodyVelocityLinear.length() / mv->definition->acceleration[0];
			if(arriveTime > 0 && arriveTime < brakeTime)
			{
				preferedSpeed = arriveTime * mv->definition->acceleration[0];
				if(preferedSpeed > maxVelocity) 
					preferedSpeed = maxVelocity;
			}*/
		}
	}
	else
	{
		findMax = false;
		preferedSpeed = 0;													// хотелось бы стоять на месте и не двигаться
		preferedAngle = mover->getGlobalPose().orientation;					// и смотреть в ту же сторону		
	}

	float bestRate = 2 * maxVelocity;				// лучший рейтинг, для начала берём самый худший
	Pose::vec bestVelocity = Pose::vec::zero();		// лучшая скорость
	// choose best segment
	
	::rayCast(velocitySpace,preferedAngle,steps,rays);

	/*
	сначала отсечь всё промежутком [0,maxVelocity],
	затем надо перебрать все оставшиеся промежутки, и выбрать
	максимальную границу.
	*/
	std::vector<float> bestRanges;
	if(findMax)
		getMaxRanges(rays, preferedSpeed, bestRanges);
	else
		getMinRanges(rays, 0, bestRanges);
	/*
	затем выбираем наилучшее направление
	*/
	vec2f preferedVelocity = preferedDirection * preferedSpeed;
	for(int i = 0; i < rays.size();i++)
	{
		float angle = rays[i].first;
		float distance = bestRanges[i];
		if( distance < 0 )
			continue;
		Pose::vec vel = distance * Pose::vec(cosf(angle),sinf(angle));
		float rate = vecDistance(vel, preferedVelocity);
		if(distance > 0 && rate < bestRate)
		{
			bestRate = rate;
			bestVelocity = vel;
		}
//.........这里部分代码省略.........
开发者ID:FrostHand,项目名称:TiGa,代码行数:101,代码来源:vo2Controller.cpp

示例2: update

void MoverVehicle::update(float dt)
{
	auto body=getBody();
	Pose pose = getGlobalPose();
	
	vec2f vel = conv(getBody()->GetLinearVelocity());	

	vec2f X = pose.axisX();
	vec2f Y = pose.axisY();
	
	float totalVel = vel.length();
	currentVelocity[0] = vel & X;
	currentVelocity[1] = getBody()->GetAngularVelocity();
	const float strafeScale = 0.9;
	float strafe = strafeScale * (vel & Y);

	if(driver && deviceMode == dmDriver)
		driver->update(dt);
	if(definition->pathProcess)
	{
		float size = this->getMaster()->getBoundingSphere().radius;
		definition->pathProcess->setSize(size);
	}
/*
	if(state == Idle)
	{
		accelerate = 0.f;
		turning = 0.f;
	}
*/
	
	if(definition->kinematic)
	{		
		b2Body * body = getBody();
		b2MassData massData;
		body->GetMassData(&massData);

		float linearDamping = definition->acceleration[0]/(definition->maxVelocity[0] );//*definition->maxVelocity[0]);
		float angularDamping = definition->acceleration[1]/(definition->maxVelocity[1] );//*definition->maxVelocity[1]);
		body->SetLinearDamping(linearDamping);
		body->SetAngularDamping(angularDamping);

		if(true)
		{
			// Using force model
			body->ApplyForce(b2conv(accelerate*definition->acceleration[0] * massData.mass *pose.getDirection()),b2conv(pose.position));
			body->ApplyTorque(turning*definition->acceleration[1] * massData.I);
			// Using impulse model
			//body->ApplyLinearImpulse(b2conv((accelerate/dt)*definition->acceleration[0] * massData.mass *pose.getDirection()),b2conv(pose.position));
			//body->ApplyAngularImpulse((turning/dt)*definition->acceleration[1] * massData.I);
		}
		else
		{
			body->ApplyForce(b2conv(accelerate*definition->acceleration[0] *pose.getDirection()),b2conv(pose.position));
			body->ApplyTorque(turning*definition->acceleration[1]);
		}
		// Comlensate steering - apply friction analog
		body->ApplyLinearImpulse(b2conv(-strafe * Y * massData.mass), b2conv(pose.position));
		if(getState() == Idle)
		{
			//body->ApplyLinearImpulse(b2conv( -currentVelocity[0] * X * massData.mass), b2conv(pose.position));
			//body->ApplyAngularImpulse(-currentVelocity[1] * massData.I);
		}
	}
	else
	{
		body->SetLinearVelocity(b2conv(accelerate*definition->maxVelocity[0]*pose.getDirection()));
		body->SetAngularVelocity(turning*definition->maxVelocity[1]);
	}
}	
开发者ID:FrostHand,项目名称:TiGa,代码行数:70,代码来源:moverVehicle.cpp


注:本文中的Pose::axisX方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。