четверг, 2 апреля 2009 г.

Скан в Apocrypha

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

Базовая механика скана в eve следующая: каждый зонд (scan probe) умеет выдавать лишь расстояние (с некоторой долей погрешности) до объектов, которые попали в сферу его действия. Если объект попадает в сферу действия двух зондов, то зная расстояние от него до каждого из зондов, мы получаем окружность, на которой он может находится. Если он попадает в сферу действия трех зондов, то мы получаем две точки, в одной из которых он может быть найден. При попадании объекта в сферу действия четырех зондов, мы получаем одну точку (для любознательных, математическая модель лежащая в основе механики описана тут: http://en.wikipedia.org/wiki/Trilateration). Тут надо понимать, что когда мы четырьмя зондами насканили некую сигнатуру с силой сигнала менее 100% (отображается красной или желтой точкой на карте системы) - это еще не значит что искомый объект находится прямо на месте этой точки: эта точка лишь приблизительное местоположение объекта. И если на следующей итерации скана мы окружим эту точку зондами со слишком малой сферой действия или поставим зонды слишком близко к этой точке, то вполне вероятно, что мы получим результаты хуже, чем на предыдущем шаге.

Более подробно о механике скана - в первую очередь относительно погрешности определения местоположения цели, выражаемую в виде силы сигнала (signal strength) - можно прочитать в нижеприведенной заметке. Надеюсь, что после её прочтения, станет меньше пилотов, которые выстраивают из зондов кубики, сферы и другие геометрические фигуры, отличные от пирамидок.

Здесь приведено хорошее приближении к формуле, задействованной в игре для определения суммарной силы скана четырех (или менее) зондов. Все это было найдено методом проб и ошибок на Сиси. Думаю, что то же самое должно быть верно и для Транквилити.
Формула состоит из следующих шагов:
1) Определение силы скана каждого зонда
2) Определение углов между каждой парой зондов и искомым объектом
3) Выбор зондов (четырех или менее), которые будут участвовать в определении силы сигнала
4) Определение итоговой силы сигнала

1) Определение силы скана каждого зонда
Вычисляется очень похоже на то, как было в старой системе скана:
sig-str = size * probe-str * distance-modifier * 0.5,
где size - базовая сила сигнала искомого объекта, probe-str = (базовая сила скана зонда) * (дополнительные модификаторы от корабля, скиллов, имплантантов и т.п.) / (дальность скана, на которую настроен зонд - 1, 2, 4, 8, ...), а distance-modifier такой же как в старой формуле: e^-((расстояние до искомого объекта / дальность скана)^2) . Тем не менее, из-за множителя 0.5 единичный зонд теперь в два раза менее эффективен, чем был раньше.

2) Определение углов между каждой парой зондов и искомым объектом
Для каждой пары зондов игра определяет угол p1-цель-p2. Если угол получается более 90 градусов, то он считается равным 90 градусам. Так, угол 120 градусов считается за угол в 90 градусов. Угол менее 90 градусов ведет к уменьшению силы сигнала, тогда как угол более 90 градусов не имеет никаких положительных эффектов.

3) Выбор зондов (четырех или менее), которые будут участвовать в определении силы сигнала
По словам Greyscale (прим.: Greyscale - разработчик, который написал о новой системе скана в своем девблоге) только "лучшие" 4 зонда участвуют в определении силы сигнала. Как игра выбирает какие из восьми зондов будут лучшими? По моим наблюдениям это происходит так:

а) Сначала игра выбирает зонды которые "лучше" использовать. Для этого скорее всего составляется рейтинг зондов. Этот рейтинг строится ни на индивидуальной силе скана каждого зонда, ни на лучших углах. По моим наблюдениям, он базируется на комбинации этих величин согласно следующей формуле: рейтинг = (угол1 + угол2 + угол3 + ...) * (сила скана зонда sig-str). Выбираются зонды с наибольшим рейтингом. Замечу, что эта система не гарантирует выбор зондов, которые в итоге дадут наибольшую силу сигнала. У меня получалось заставлять игру выбирать не оптимальные зонды.

б) Когда построен рейтинг зондов, игра решает сколько зондов будет задействовано. Это скорее всего делается следующим образом: суммируются все углы между зондами (прим.: видимо, имеются ввиду все углы вида p1-цель-p2, которые были задействованы в п.2). Если сумма больше 270 (например, 6 углов по 45+ градусов), то используются четыре зонда. Если она больше 180, то используются три зонда. Если она меньше 180, то используется два зонда. Если сумма всех углов менее 135 градусов, то все зонды работают независимо и каждая выдает свой сигнал (прим.: при этом на карте системы вы имеете множество сфер с центром в каждом зонде, это как раз один из случаев, когда последующая итерация сканирования может быть хуже предыдущей - виноваты слишком острые углы между зондами и целью). Замечание: это частный случай формулы, который корректен только в случае использования четырех или более зондов. В следующем посте вы можете найти обобщенную формулу для любого числа зондов.

4) Определение итоговой силы сигнала
Когда зонды выбраны, итоговая формула выглядит так:
сила сигнала = (усредненная сила скана sig-str всех зондов) * 2 * (угол1 + угол2 + угол3 + угол4) / 360
Заметьте , что по моим наблюдениям только четыре наибольших угла между зондами используются в вычислениях. Заметьте также, что множитель "*2" в этой формуле компенсирует множитель "*0.5" в формуле из п.1.

Некоторые следствия:
1) Расположение тетраэдром (пирамидкой) вокруг цели является оптимальным. Хотя это и не единственное оптимальное расположение, оно имеет наибольшую устойчивость к ошибкам.
2) Расположение более чем одного зонда в одной точке не обязательно приводит к появлению эха. Это может даже улучшить результат сканирования (хотя и очень слабо), если вы не переборщите с этим.
3) Выбор игрой "лучших зондов" не обязательно является действительно лучшим, хотя он и довольно хорош.
4) Изменение силы сигнала линейно зависит от углов. Если бы я подходил к созданию механики скана с той же стороны как разработчики, я бы сделал синусоидальную зависимость. Мне это кажется более разумным.

источник



Комментариев нет:

Отправить комментарий