Простой алгоритм движения ИИ не работает правильно

Я работаю над тем, что должно быть очень простым алгоритмом движения, который принимает вектор D3DXVECTOR3s и перемещает AI в каждую точку. Проблема в том, что, если я пройду больше, чем одну точку, ИИ, похоже, застрянет в точке, равной среднему из точек.

Точки (x, z):
10, 10
10, 20
30, 30
60, 20

maxSpeed ​​10 только для тестирования.

void Obj::MoveToLocation(D3DXVECTOR3 newLocation, float deltaTime)
{
D3DXVECTOR3 directionToTarget = newLocation - location;
D3DXVec3Normalize(&directionToTarget, &directionToTarget);

location += maxSpeed * directionToTarget * deltaTime;
}

void Obj::Patrol(std::vector<D3DXVECTOR3> locations, float deltaTime)
{
hasArrived = false;

for (int i = 0; i < locations.size(); ++i)
{
if (!hasArrived)
MoveToLocation(locations[i], deltaTime);

if ((location.x <= locations[i].x + radius.x) && (location.x >= locations[i].x - radius.x) &&
(location.z <= locations[i].z + radius.z) && (location.z >= locations[i].z - radius.z))
{
hasArrived = true;
}
}
}

Я просто ищу несколько советов о том, как я могу заставить это работать. Сейчас я в растерянности, хотя это кажется очень простой проблемой.

1

Решение

void Obj::MoveToLocation(D3DXVECTOR3 newLocation, float deltaTime)
{
D3DXVECTOR3 directionToTarget = newLocation - location;

if (D3DXVec3Length(&directionToTarget) <= maxSpeed * deltaTime)
{
// If this step would take us past the destination, just stop there
// instead.
location = newLocation;
}
else
{
D3DXVec3Normalize(&directionToTarget, &directionToTarget);

location += maxSpeed * directionToTarget * deltaTime;
}
}

// Call this once to set the patrol route
void Obj::Patrol(std::vector<D3DXVECTOR3> locations)
{
patrolRoute = locations;
patrolIndex = 0; // Maybe pick the closest point instead?
}

// Call this each time the object should move (once per frame/turn)
void Obj::UpdatePatrol(float deltaTime)
{
if (patrolRoute == NULL || patrolRoute.empty())
{
return;
}

if (patrolIndex >= patrolRoute.size())
{
// Start again from the beginning
patrolIndex -= patrolRoute.size();
}

// Move towards the next location
D3DXVECTOR3 nextLocation = patrolRoute[patrolIndex];
MoveToLocation(nextLocation, deltaTime);

float dx = location.x - nextLocation.x;
float dz = location.z - nextLocation.z;

if ((dx <= radius.x) && (dx >= -radius.x) &&
(dz <= radius.z) && (dz >= -radius.z))
{
// We have reached it. Select the next destionation.
patrolIndex++;
}
}
0

Другие решения

Других решений пока нет …