本文整理汇总了C++中AbstractVehicle类的典型用法代码示例。如果您正苦于以下问题:C++ AbstractVehicle类的具体用法?C++ AbstractVehicle怎么用?C++ AbstractVehicle使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了AbstractVehicle类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: kVehicles
//-----------------------------------------------------------------------------
void EmptyPlugin::update (const float currentTime, const float elapsedTime)
{
if( false == this->isEnabled() )
{
return;
}
AbstractVehicleGroup kVehicles( m_kVehicles );
kVehicles.update( currentTime, elapsedTime );
if( 0 == m_bShowMotionStatePlot )
{
return;
}
AbstractVehicle* pVehicle = SimpleVehicle::getSelectedVehicle();
if( pVehicle != NULL )
{
// update motion state plot
this->m_kMotionStateProfile.recordUpdate( pVehicle, currentTime, elapsedTime );
m_pCamera->setCameraTarget( pVehicle );
m_pGrid->setGridCenter( pVehicle->position() );
}
BaseClass::update( currentTime, elapsedTime);
}
示例2: steerToAvoidCloseNeighbors
float3
OpenSteer::SteerLibrary::
steerToAvoidCloseNeighbors (const AbstractVehicle& v,
const float minSeparationDistance,
const AVGroup& others)
{
// for each of the other vehicles...
for (AVIterator i = others.begin(); i != others.end(); i++)
{
AbstractVehicle& other = **i;
if (&other != &v)
{
const float sumOfRadii = v.radius() + other.radius();
const float minCenterToCenter = minSeparationDistance + sumOfRadii;
const float3 offset = float3_subtract(make_float3(other.position()), make_float3(v.position()));
const float currentDistance = float3_length(offset);
if (currentDistance < minCenterToCenter)
{
annotateAvoidCloseNeighbor (other, minSeparationDistance);
return float3_perpendicularComponent(float3_minus(offset), make_float3(v.forward()));
}
}
}
// otherwise return zero
return float3_zero();
}
示例3: steerForFlee
float3
OpenSteer::SteerLibrary::
steerForFlee (const AbstractVehicle& v, const float3& target)
{
const float3 desiredVelocity = float3_subtract(make_float3(v.position()), target);
return float3_subtract(desiredVelocity, v.velocity());
}
示例4: predictNearestApproachTime
float
OpenSteer::SteerLibrary::
predictNearestApproachTime (const AbstractVehicle& v,
const AbstractVehicle& other)
{
// imagine we are at the origin with no velocity,
// compute the relative velocity of the other vehicle
const float3 myVelocity = v.velocity();
const float3 otherVelocity = other.velocity();
const float3 relVelocity = float3_subtract(otherVelocity, myVelocity);
const float relSpeed = float3_length(relVelocity);
// for parallel paths, the vehicles will always be at the same distance,
// so return 0 (aka "now") since "there is no time like the present"
if (relSpeed == 0)
return 0;
// Now consider the path of the other vehicle in this relative
// space, a line defined by the relative position and velocity.
// The distance from the origin (our vehicle) to that line is
// the nearest approach.
// Take the unit tangent along the other vehicle's path
const float3 relTangent = float3_scalar_divide(relVelocity, relSpeed);
// find distance from its path to origin (compute offset from
// other to us, find length of projection onto path)
const float3 relPosition = float3_subtract(make_float3(v.position()), make_float3(other.position()));
const float projection = float3_dot(relTangent, relPosition);
return projection / relSpeed;
}
示例5: xxxsteerForSeek
float3
OpenSteer::SteerLibrary::
xxxsteerForSeek (const AbstractVehicle& v, const float3& target)
{
const float3 offset = float3_subtract(target, make_float3(v.position()));
const float3 desiredVelocity = float3_truncateLength(offset, v.maxSpeed());
return float3_subtract(desiredVelocity, v.velocity());
}
示例6:
void
OpenSteer::OpenSteerDemo::circleHighlightVehicleUtility (const AbstractVehicle& vehicle)
{
if (&vehicle != NULL) drawXZCircle (vehicle.radius () * 1.1f,
vehicle.position(),
gGray60,
20);
}
示例7: steerForTargetSpeed
float3
OpenSteer::SteerLibrary::
steerForTargetSpeed (const AbstractVehicle& v,
const float targetSpeed)
{
const float mf = v.maxForce ();
const float speedError = targetSpeed - v.speed ();
return float3_scalar_multiply(make_float3(v.forward ()), clip (speedError, -mf, +mf));
}
示例8: steerToFollowPath
float3
OpenSteer::SteerLibrary::
steerToFollowPath (const AbstractVehicle& v,
const int direction,
const float predictionTime,
Pathway& path)
{
// our goal will be offset from our path distance by this amount
const float pathDistanceOffset = direction * predictionTime * v.speed();
// predict our future position
const float3 futurePosition = v.predictFuturePosition (predictionTime);
// measure distance along path of our current and predicted positions
const float nowPathDistance =
path.mapPointToPathDistance (make_float3(v.position ()));
const float futurePathDistance =
path.mapPointToPathDistance (futurePosition);
// are we facing in the correction direction?
const bool rightway = ((pathDistanceOffset > 0) ?
(nowPathDistance < futurePathDistance) :
(nowPathDistance > futurePathDistance));
// find the point on the path nearest the predicted future position
// XXX need to improve calling sequence, maybe change to return a
// XXX special path-defined object which includes two float3s and a
// XXX bool (onPath,tangent (ignored), withinPath)
float3 tangent;
float outside;
const float3 onPath = path.mapPointToPath (futurePosition,
// output arguments:
tangent,
outside);
// no steering is required if (a) our future position is inside
// the path tube and (b) we are facing in the correct direction
if ((outside < 0) && rightway)
{
// all is well, return zero steering
return float3_zero();
}
else
{
// otherwise we need to steer towards a target point obtained
// by adding pathDistanceOffset to our current path position
float targetPathDistance = nowPathDistance + pathDistanceOffset;
float3 target = path.mapPathDistanceToPoint (targetPathDistance);
annotatePathFollowing (futurePosition, onPath, target, outside);
// return steering to seek target on path
return steerForSeek (v, target);
}
}
示例9: findNextIntersectionWithSphere
void
OpenSteer::SteerLibrary::
findNextIntersectionWithSphere (const AbstractVehicle& v,
SphericalObstacleData& obs,
PathIntersection& intersection)
{
// xxx"SphericalObstacle& obs" should be "const SphericalObstacle&
// obs" but then it won't let me store a pointer to in inside the
// PathIntersection
// This routine is based on the Paul Bourke's derivation in:
// Intersection of a Line and a Sphere (or circle)
// http://www.swin.edu.au/astronomy/pbourke/geometry/sphereline/
float b, c, d, p, q, s;
float3 lc;
// initialize pathIntersection object
intersection.intersect = false;
intersection.obstacle = &obs;
// find "local center" (lc) of sphere in boid's coordinate space
lc = v.localizePosition (obs.center);
// computer line-sphere intersection parameters
b = -2 * lc.z;
c = square (lc.x) + square (lc.y) + square (lc.z) -
square (obs.radius + v.radius());
d = (b * b) - (4 * c);
// when the path does not intersect the sphere
if (d < 0) return;
// otherwise, the path intersects the sphere in two points with
// parametric coordinates of "p" and "q".
// (If "d" is zero the two points are coincident, the path is tangent)
s = sqrtXXX (d);
p = (-b + s) / 2;
q = (-b - s) / 2;
// both intersections are behind us, so no potential collisions
if ((p < 0) && (q < 0)) return;
// at least one intersection is in front of us
intersection.intersect = true;
intersection.distance =
((p > 0) && (q > 0)) ?
// both intersections are in front of us, find nearest one
((p < q) ? p : q) :
// otherwise only one intersections is in front, select it
((p > 0) ? p : q);
return;
}
示例10:
void
OpenSteer::OpenSteerDemo::position3dCamera (AbstractVehicle& selected,
float distance,
float /*elevation*/)
{
//selectedVehicle = &selected;
if (&selected)
{
const float3 behind = float3_scalar_multiply(make_float3(selected.forward()), -distance);
camera.setPosition ( make_float4(float3_add(make_float3(selected.position()), behind), 0.f) );
camera.target = make_float3(selected.position());
}
}
示例11:
void
OpenSteer::OpenSteerDemo::position3dCamera (AbstractVehicle& selected,
float distance,
float /*elevation*/)
{
SteeringVehicle::setSelectedVehicle( &selected );
if (&selected)
{
const Vec3 behind = selected.forward() * -distance;
OpenSteer::Camera::accessInstance().setPosition (selected.position() + behind);
OpenSteer::Camera::accessInstance().target = selected.position();
}
}
示例12: steerForSeparation
float3
OpenSteer::SteerLibrary::
steerForSeparation (const AbstractVehicle& v,
const float maxDistance,
const float cosMaxAngle,
const AVGroup& flock)
{
// steering accumulator and count of neighbors, both initially zero
float3 steering = float3_zero();
int neighbors = 0;
// for each of the other vehicles...
for (AVIterator other = flock.begin(); other != flock.end(); other++)
{
if (inBoidNeighborhood (v, **other, v.radius() * 3, maxDistance, cosMaxAngle))
{
// add in steering contribution
// (opposite of the offset direction, divided once by distance
// to normalize, divided another time to get 1/d falloff)
const float3 offset = float3_subtract(make_float3((**other).position()), make_float3(v.position()));
const float distanceSquared = float3_dot(offset, offset);
steering = float3_add(steering, float3_scalar_divide(offset, -distanceSquared));
// count neighbors
neighbors++;
}
}
// divide by neighbors, then normalize to pure direction
if (neighbors > 0)
steering = float3_normalize(float3_scalar_divide(steering, (float)neighbors));
return steering;
}
示例13: steerForCohesion
float3
OpenSteer::SteerLibrary::
steerForCohesion (const AbstractVehicle& v,
const float maxDistance,
const float cosMaxAngle,
const AVGroup& flock)
{
// steering accumulator and count of neighbors, both initially zero
float3 steering = float3_zero();
int neighbors = 0;
// for each of the other vehicles...
for (AVIterator other = flock.begin(); other != flock.end(); other++)
{
if (inBoidNeighborhood (v, **other, v.radius() * 3, maxDistance, cosMaxAngle))
{
// accumulate sum of neighbor's positions
steering = float3_add(steering, make_float3((**other).position()));
// count neighbors
neighbors++;
}
}
// divide by neighbors, subtract off current position to get error-
// correcting direction, then normalize to pure direction
if (neighbors > 0)
steering = float3_normalize(float3_subtract(float3_scalar_divide(steering, (float)neighbors), make_float3(v.position())));
return steering;
}
示例14: steerToStayOnPath
float3
OpenSteer::SteerLibrary::
steerToStayOnPath (const AbstractVehicle& v,
const float predictionTime,
Pathway& path)
{
// predict our future position
const float3 futurePosition = v.predictFuturePosition (predictionTime);
// find the point on the path nearest the predicted future position
float3 tangent;
float outside;
const float3 onPath = path.mapPointToPath (futurePosition,
tangent, // output argument
outside); // output argument
if (outside < 0)
{
// our predicted future position was in the path,
// return zero steering.
return float3_zero();
}
else
{
// our predicted future position was outside the path, need to
// steer towards it. Use onPath projection of futurePosition
// as seek target
annotatePathFollowing (futurePosition, onPath, onPath, outside);
return steerForSeek (v, onPath);
}
}
示例15: findIntersectionWithVehiclePath
void
OpenSteer::
PlaneObstacle::
findIntersectionWithVehiclePath (const AbstractVehicle& vehicle,
PathIntersection& pi) const
{
// initialize pathIntersection object to "no intersection found"
pi.intersect = false;
const Vec3 lp = localizePosition (vehicle.position ());
const Vec3 ld = localizeDirection (vehicle.forward ());
// no obstacle intersection if path is parallel to XY (side/up) plane
if (ld.dot (Vec3::forward) == 0.0f) return;
// no obstacle intersection if vehicle is heading away from the XY plane
if ((lp.z > 0.0f) && (ld.z > 0.0f)) return;
if ((lp.z < 0.0f) && (ld.z < 0.0f)) return;
// no obstacle intersection if obstacle "not seen" from vehicle's side
if ((seenFrom () == outside) && (lp.z < 0.0f)) return;
if ((seenFrom () == inside) && (lp.z > 0.0f)) return;
// find intersection of path with rectangle's plane (XY plane)
const float ix = lp.x - (ld.x * lp.z / ld.z);
const float iy = lp.y - (ld.y * lp.z / ld.z);
const Vec3 planeIntersection (ix, iy, 0.0f);
// no obstacle intersection if plane intersection is outside 2d shape
if (!xyPointInsideShape (planeIntersection, vehicle.radius ())) return;
// otherwise, the vehicle path DOES intersect this rectangle
const Vec3 localXYradial = planeIntersection.normalize ();
const Vec3 radial = globalizeDirection (localXYradial);
const float sideSign = (lp.z > 0.0f) ? +1.0f : -1.0f;
const Vec3 opposingNormal = forward () * sideSign;
pi.intersect = true;
pi.obstacle = this;
pi.distance = (lp - planeIntersection).length ();
pi.steerHint = opposingNormal + radial; // should have "toward edge" term?
pi.surfacePoint = globalizePosition (planeIntersection);
pi.surfaceNormal = opposingNormal;
pi.vehicleOutside = lp.z > 0.0f;
}