Я пытался найти пример предотвращения столкновений, который я могу адаптировать и использовать для игры, над которой я работаю.Он будет использоваться для моделирования движения лыжника, чтобы избежать деревьев на холме.Я основываю движение на Поведение рулевого управления для автономных персонажей , и есть много хороших примеров для следования по пути и флокирования, но я не могу найти хороших примеров для предотвращения столкновений. На сайте Code of Nature были отличные учебные пособия по рулевому управлению, но, казалось, они охватывали все, кроме предотвращения препятствий.
Я преобразовал код из здесь , но он не работает каккак и должно быть, поскольку столкновения обнаруживаются путем проецирования центра препятствий на вектор скорости без учета того, что центр препятствий может находиться за пределами столкновения, но круг все еще сталкивается.Вот код, который я адаптировал (написанный на языке «Обработка (на основе Java))».
// Method to update location
void update() {
// Update velocity
vel.add(acc);
// Limit speed
vel.limit(maxspeed);
loc.add(vel);
// Reset accelertion to 0 each cycle
acc.mult(0);
}
void obstacleAvoid() {
float checkLength = 30*vel.mag();
PVector forward,diff,ray,projection,force;
float dotProd,dis;
forward = vel.get();
forward.normalize();
ray = forward.get();
ray.mult(checkLength);
for ( int i = 0; i < obs.size(); i++ ) {
Obstacle ob = (Obstacle)obs.get(i);
diff = ob.pos.get();
diff.sub(loc);
PVector temp2 = forward.get();
temp2.mult(ob.r);
diff.sub(temp2);
dotProd = diff.dot(forward);
if ( dotProd > 0 ) {
projection = forward.get();
projection.mult(dotProd);
dis = PVector.dist(projection,diff);
if ( (dis < (ob.r + r)) && (projection.mag() < ray.mag()) ) {
ob.hit = true;
force = forward.get();
force.mult(maxforce);
if ( sign(diff,vel) == -1 ) { //CCW
force.set(force.y,-force.x,0);
}
else { //CW
force.set(-force.y,force.x,0);
}
force.mult(1-(projection.mag())/ray.mag());
force.limit(maxforce);
acc.add(force);
}
}
}
}
Поэтому, чтобы помочь мне, мне было интересно, если бы кто-нибудь знал о каких-либо полных примерах предотвращения столкновений, которые следуют за Поведение рулядля автономных персонажей способ сделать вещи лучше. Этот сайт является примером приложения для газеты и является точным примером, для которого я хотел бы увидеть код.К сожалению, нет никакого кода, чтобы пойти с ним, и я попытался декомпилировать его, но он просто показал основной класс, так что это было не очень полезно.Если у кого-то есть код для этого примера или что-то в этом роде, или учебник, я был бы очень признателен.