Помогите пожалуйста зайке , ему некуда бежать!

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 06:42

Приветствую! Текста много, но всё лаконично и доступно.
У меня есть зайка и он попал в беду!!! Сам я справится не могу, так как не достаточно знаний в области тригонометрии/векторной алгебры/и прочих дисциплинах(пинал очень интересные вещи и считал ворон во время учёбы в школе).
Прошу у вас помощи в спасении моего зайки! Кто хоть как то помогает, тот автоматически получает титул "Спасатель пушистика"!

О самой беде:
Зайку окружают злые волки что бы его съесть. Волк бывает один, а бывает несколько. Зайка сидит жопкой на NavMesh Surface(навигация версии 2.0 https://github.com/Unity-Technologies/NavMeshComponents) и его задача найти путь, по которому следует выбраться.
У зайки есть триггер с радиусом в 8.5, и он этим триггером обнаруживает волков. Первое что приходит в голову, брать и разворачиваться от волка в обратную сторону. А именно: получить угол(для направления) и дистанцию от волка к зайцу, умножить на 10 и затем:
Синтаксис:
Используется csharp
Vector3 point = wolf.position + (direction * distance);


Таким образом получаем точку как можно дальше(аж за картой) и устанавливаем для NavMesh Agent'а. Как итог, заяц добежит до края леса и остановится в самой крайней точке, так как заканчивается Surface, и в данной ситуации меня всё устраивает.
Когда на охоту выходят двое волков, можно получить среднее арифметическое между значениями их углов к зайцу и бежать в обратном направлении, но это не всегда работает.
К примеру: от зайца до волков 50градусов и 140градусов , среднее между ними будет 95, а обратное направление будет под углом 275(зайка спокойно убегает), но в случае с 45 и 300, угол будет уже 172.5(который как бы устраивает...),но вот обратное ему 352.5, и при таком направлении его всё таки скушает какой то из волков). Это даже не учитывая дистанцию , которая может быть разной от зайца к волкам.
Думаю в случае, когда его окружили 4-8 волков и выход без урона не найти, то там уже зайка вынужден будет получить пару укусов, но все же убежать в ту сторону, где их будет меньше.
Как же всё таки быть зайке в данной ситуации?
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение 1max1 11 июл 2018, 07:56

А зачем по углам-то проверять? проверяй по дистанции:
1) если 1 волк, то понятно, бежим тупо от него, расчетов никаких не нужно проводить.
2) если 2, берем вектор от первого волка, до второго, находи перпендикуляр, проверяем с какой стороны зайка, и бежим по перпендикуляру, но тут я надеюсь, что скорость всех волков одинаковая, ибо если нет, надо корректировать под скорость самого шустрого.
Изображение
3) если 3+, тут сложнее, сначала проверка на то что, волки не окружили зайца со всех сторон, а напали с одной, тогда бежим в сторону от них, если всё таки окружили, можно взять самых ближайших по периметру волков и проверить дистанции по очереди все пары. Вычитаем из расстояния перпендикуляра, расстояния 2 волков, связанных с этим перпендикуляром, и где в итоге окажется наименьшая дистанция для зайца туда и рвать, но опять таки даже если на одном волке будет оптимальная дистанция, то второй может укусить, так что тут нужно учитывать именно пару, а не одного волка. В данной ситуации черный путь самый оптимальный для побега. (хотя серый тоже сойдёт, просто я нарисовал так криво:D)
Изображение
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 08:10

1max1 писал(а):А зачем по углам-то проверять? проверяй по дистанции:
1) если 1 волк, то понятно, бежим тупо от него, расчетов никаких не нужно проводить.
2) если 2, берем вектор от первого волка, до второго, находи перпендикуляр, проверяем с какой стороны зайка, и бежим по перпендикуляру, но тут я надеюсь, что скорость всех волков одинаковая, ибо если нет, надо корректировать под скорость самого шустрого.
Изображение
3) если 3+, тут сложнее, сначала проверка на то что, волки не окружили зайца со всех сторон, а напали с одной, тогда бежим в сторону от них, если всё таки окружили, можно взять самых ближайших по периметру волков и проверить дистанции по очереди все пары. Вычитаем из расстояния перпендикуляра, расстояния 2 волков, связанных с этим перпендикуляром, и где в итоге окажется наименьшая дистанция для зайца туда и рвать, но опять таки даже если на одном волке будет оптимальная дистанция, то второй может укусить, так что тут нужно учитывать именно пару, а не одного волка. В данной ситуации черный путь самый оптимальный для побега.
Изображение

Спасибо, сейчас буду пробовать спасать зайку! Хотел бы спросить, что вы имели ввиду под "проверка на то что, волки не окружили зайца со всех сторон"? Вы имеете ввиду со всех четвертей плоскости?
Так же проблемы с получением перпендикуляра, вот что получается:
ИзображениеИзображение
Последний раз редактировалось Nubila 11 июл 2018, 09:14, всего редактировалось 4 раз(а).
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение IDoNotExist 11 июл 2018, 09:10

1max1 писал(а):Изображение

Дак это же самый что ни на есть граф получается, просто взвесьте вершины, допустим по дистанциям от волков, и примените A* поиск к вершине с наибольшим весом (если граф будет сложный), и не надо будет составлять тысячу условий.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 09:13

IDoNotExist писал(а):
1max1 писал(а):Изображение

Дак это же самый что ни на есть граф получается, просто взвесьте вершины, допустим по дистанциям от волков, и примените A* поиск к вершине с наибольшим весом (если граф будет сложный), и не надо будет составлять тысячу условий.

Взвешивать вершины по дистанциям? А* поиск? Я так понимаю тут уже нужно теорию графов изучать?
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение IDoNotExist 11 июл 2018, 09:18

Nubila писал(а):Взвешивать вершины по дистанциям? А* поиск? Я так понимаю тут уже нужно теорию графов изучать?

Тут есть всё что нужно знать.
https://ru.wikipedia.org/wiki/A*
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение 1max1 11 июл 2018, 09:28

Вот этой штукой можно строить перпендикуляры https://docs.unity3d.com/ScriptReferenc ... Cross.html
Не знаю что там на счет графов, никогда не касался их, возможно это даже оптимальнее вариант будет.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение IDoNotExist 11 июл 2018, 09:32

1max1 писал(а):Не знаю что там на счет графов, никогда не касался их, возможно это даже оптимальнее вариант будет.

Тут надо всё-таки оговориться, что оптимальнее и удобнее будет, только в том случае если вокруг будет куча волков, то есть не 4 и не 5, а 10-20, к примеру, а если такого количества не предвидится, то граф пожалуй и не нужен.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 09:36

IDoNotExist писал(а):
1max1 писал(а):Не знаю что там на счет графов, никогда не касался их, возможно это даже оптимальнее вариант будет.

Тут надо всё-таки оговориться, что оптимальнее и удобнее будет, только в том случае если вокруг будет куча волков, то есть не 4 и не 5, а 10-20, к примеру, а если такого количества не предвидится, то граф пожалуй и не нужен.

Максимальное количество волков = 10. В основном будут как раз по 4-5.
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 09:43

1max1 писал(а):Вот этой штукой можно строить перпендикуляры https://docs.unity3d.com/ScriptReferenc ... Cross.html

Синтаксис:
Используется csharp
        Vector3 v = new Vector3(0, 0, 1);
        Vector3 AB = B - A;
        Vector3 C_prime = A + AB / 2;
        Vector3 C = C_prime + Vector3.Normalize(Vector3.Cross(AB, v));
        Raycaster.DrawLine(C_prime, obj3.position, Color.black);

Пытаюсь ею построить, выходит то что на скрине выше.
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение 1max1 11 июл 2018, 09:50

Так ты ведь не отрисовываешь нигде вектор С:
Синтаксис:
Используется csharp
Raycaster.DrawLine(zaika.position, zaika.position + C * 100, Color.black);

Там либо + С либо -
Тут еще надо длину вектора С, через проекцию надо найти

пс, я так прикинул, вообще довольно сложный алгоритм я тебе предложил, слишком много условий придется проверять, думаю нужно найти че попроще))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 09:58

1max1 писал(а):Так ты ведь не отрисовываешь нигде вектор С:
Синтаксис:
Используется csharp
Raycaster.DrawLine(zaika.position, zaika.position + C * 100, Color.black);

Там либо + С либо -
Тут еще надо длину вектора С, через проекцию надо найти

пс, я так прикинул, вообще довольно сложный алгоритм я тебе предложил, слишком много условий придется проверять, думаю нужно найти че попроще))

C плюсом:
Изображение

С минусом:
Изображение

Скорее всего в коде проблема какая то.
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение 1max1 11 июл 2018, 10:04

Меня смущается то что игра в 3д, возможно координата Z искривляет видимость, или камера неортогональная. Проверь дебагом угол между AB и C, там должно быть 90 градусов.
Vector3.Angle(AB, C);
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение Nubila 11 июл 2018, 10:10

1max1 писал(а):Меня смущается то что игра в 3д, возможно координата Z искривляет видимость, или камера неортогональная. Проверь дебагом угол между AB и C, там должно быть 90 градусов.
Vector3.Angle(AB, C);

На сколько я понял, С это точка на линии, которая параллельна позиции зайца(шара на скрине). Но по расчёту она у меня всегда в центре , и получается что Дэбаг угол выводит не 90. Только я вот не знаю, как её сделать параллельной , а не тупо по центру AB.
Аватара пользователя
Nubila
UNITрон
 
Сообщения: 160
Зарегистрирован: 12 июл 2017, 15:59
Откуда: Запорожье

Re: Помогите пожалуйста зайке , ему некуда бежать!

Сообщение 1max1 11 июл 2018, 10:16

Я честно говоря не понимаю зачем тебе точка по центру нужна, ведь самая короткая дистанция это именно перпендикуляр...
Синтаксис:
Используется csharp
Vector3 AB = B - A; // A и В позиции волков, это понятно
// Vector3 C_prime = A + AB / 2; // Это нам не надо
Vector3 C = Vector3.Cross(AB, Vector3.forward).normalize; // Наш перпендикуляр
Raycaster.DrawLine(zaika.position, zaika.position +- C * 100, Color.black); // Значение 100 тут чисто для дебага
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 19