Пример предотвращения столкновений или Справка

90
12

Я пытаюсь найти пример предотвращения столкновений, который я могу адаптировать и использовать для игры, над которой я работаю. Он будет использоваться для моделирования движения лыжника, чтобы избежать деревьев на холме. Я основываю движение Offing Behaviors для автономных персонажей, и есть много хороших примеров для следования и стекания пути, но я не могу найти хороших для предотвращения столкновений. На веб-сайте Nature of Code были потрясающие руководства по рулевому управлению, но, казалось, охватывали все, кроме предотвращения препятствий.


Я преобразовал код из здесь, но он не работает так хорошо, как должен, потому что столкновений обнаруживается путем проецирования центра препятствий на вектор скорости без учета, когда центр препятствий может находиться за пределами столкновения, но круг все еще сталкивается. Вот код, который я адаптировал (написанный в разделе Обработка (на основе 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);
}
}
}
}


Итак, чтобы помочь мне, мне было интересно узнать, не знает ли кто-нибудь о каких-либо полных примерах предотвращения столкновений, которые следуют за принципами поведения для автономных персонажей, чтобы сделать что-то лучше. Этот сайт является примером апплета для бумаги и является точным примером, я хотел бы видеть код для. К сожалению, нет никакого кода, чтобы прийти с ним, и я попытался декомпилировать его, но он просто показал основной класс, так что это было не очень полезно. Если у кого-то есть код для этого примера или что-то в этом роде или учебник, я был бы очень признателен.

спросил(а) 2021-01-19T15:26:21+03:00 6 месяцев, 2 недели назад
1
Решение
63

Craig Reynolds не может выпускать исходный код для интересующих вас апплетов. Аналогичный исходный код доступен в С++ по адресу OpenSteer, который поддерживается Рейнольдсом. Христиан Шнелльхаммер и Томас Фейлкас работали над расширением оригинальной бумаги Рейнольдса. Их статья переведена на english и содержит раздел об избежании препятствий. Исходный код для их работы доступен в Java. Тем не менее, Я думаю, что код Shiffman является отличной отправной точкой, и похоже, что вы почти близки к тому, что вы хотите уже


Одна из моих первых программ обработки изменила пример Boids, чтобы имитировать апокалипсис зомби. Треугольники преследовали круги, которые избегали их. Каждый оставшийся в живых проверяет других зомби в своем видении и усредняет координаты местоположения угроз в функции, PVector panic(ArrayList infected). После этого было связано с переносом нового вектора негативно и добавлением его к вектору тока, оставшегося в живых, как и любая другая сила. Что-то вроде:


void flock(ArrayList uninfected, ArrayList infected) {
PVector sep = separate(uninfected); // Separation
PVector ali = align(uninfected); // Alignment
PVector coh = cohesion(uninfected); // Cohesion
PVector pan = panic(infected); // Panic
// Arbitrarily weight these forces
sep.mult(4.0);
ali.mult(1.0);
coh.mult(2.0);
pan.mult(-3.0);
// Add the force vectors to acceleration
acc.add(sep);
acc.add(ali);
acc.add(coh);
acc.add(pan);
}

Если ваш лыжник успешно обнаруживает препятствия, тогда проблема избежания является проблемой. Добавляя более сильный вес к вектору избегания, увеличивая радиус, который лыжник может "видеть" для взаимодействия с объектами, или даже добавление метода к объекту, который возвращает местоположение ближайшей точки к лыжнику, может решить вашу проблему. Вы также можете добавить замедление, основанное на расстоянии от лыжника до ближайшего препятствия перед ним.


Помните, что даже апплет, который вам интересен, не позволяет избежать препятствий. Мое решение может быть не совсем тем, что происходит в апплете, но, играя с силами, определяющими ваше направление лыжника, вы можете добиться очень схожим (и, возможно, лучшим) эффектом.

ответил(а) 2021-01-19T15:26:21+03:00 6 месяцев, 2 недели назад
45

Оформить эту ссылку на сайте разработки сайта NEHE:


В этом уроке вы узнаете основы обнаружения столкновений, реакция столкновения и физическая основанные на моделировании. Этот учебник больше концентрируется на том, как столкновение чем на фактических кода, хотя все важные код объясняется.



http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=30

Это делается с использованием С++ и win32 API. Хотя вы можете найти ссылку для Java Port с помощью JOGL.


И
Исходный код для http://www.red3d.com/cwr/steer/ доступен здесь http://opensteer.sourceforge.net/, хотя в С++. Вы проверили его?

ответил(а) 2021-01-19T15:26:21+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема