PDA

Просмотр полной версии : "Радар" своими руками :)



Small_Bee
21.04.2011, 02:06
Как заставить работать родной радар, я не разобрался, так что попробовал реализовать свой.

Вот таким вот "коротенько, минут на сорок" (С), образом можно реализовать собственный "радар".



using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
using maddox.GP;

public class Mission : maddox.game.AMission
{
private const double RADAR_X = 170291.06; // положение радара по X;
private const double RADAR_Y = 188786.78; // положение радара по Y;
private const double RADAR_Z = -60; // положение радара по Z;

private const double RADIUS = 20000; // радиус радара, метры;
private const int CHECK_PERIOD = 10; // частота обновления радара, секунды;
private const int ARMY = 2; // чьи самолеты отслеживать (1 - красные, 2 - синие);

private Point3d radarPoint; // местоположение радара в понятном игре виде;
private bool radarDestroyed = false; // признак уничтожения радара;

private void serverMessage(string msg)
{
Player pl = GamePlay.gpPlayer();
Player[] players = { pl };
object[] args = { msg };
GamePlay.gpLogServer(players, msg, args);
}

public override void OnBattleStarted()
{
base.OnBattleStarted();
radarPoint = new Point3d(RADAR_X, RADAR_Y, RADAR_Z);
}

public override void OnTickGame()
{
base.OnTickGame();
if (!radarDestroyed)
{
if (Time.tickCounter() % (CHECK_PERIOD * 30) == 0)
{
lockTargets();
}
}
}

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
if ("radarDestroyedTrigger".Equals(shortName) && active)
{
radarDestroyed = true;
GamePlay.gpGetTrigger("radarDestroyedTrigger").Enable = false;
serverMessage("Радар: скоропостижно скончался...");
}
}

private void lockTargets()
{
bool hasTargets = false;
foreach (AiAirGroup airGroup in GamePlay.gpAirGroups(ARMY))
{
Dictionary<AiAirGroup, int> groupsCounter = new Dictionary<AiAirGroup, int>();
foreach (AiActor groupMember in airGroup.GetItems())
{
if (groupMember is AiAircraft)
{
hasTargets = true;
if (RADIUS > groupMember.Pos().distance(ref radarPoint))
{
string msg =
String.Format("Радар: Самолет в квадрате {0}", GamePlay.gpSectorName(groupMember.Pos().x, groupMember.Pos().y));
serverMessage(msg);
}
}
}
}
if (!hasTargets)
{
serverMessage("Радар: цели не обнаружены");
}
serverMessage("Радар: пииик-пик!");
}
}


Это только "базовая реализация". Само собой, можно усложнять/совершенствовать.. Например вспомнив стереометрию, можно реализовать областью прослушивания не сферу, как выше, а например конус, и крутить его по сторонам...; ввести ограничения по высоте... Можно определять типы самолетов; сравнив координаты целей между двумя проходами, можно посчитать направление и скорость, поднять на перехват истребители или.. или... или.. Имея точную карту высот, реализовать мертвые зоны за возвышенностями и т.д. Варьировать точность определения количества самолетов и их типов от расстояния до "радара"... Выводить сообщения игрокам о целях выборочно, команде или всем сразу... Или вообще сделать радар передвижным. :) В общем дофига всего.

Реализованная миссия в аттаче.

Стоит радар, летят две группы хенкелей. раз в 10 секунд "радар" "сканирует" местность радиусом в 20 км.. Как только в радиус заходят синие самолеты, их координаты светятся в окне сообщений. Красные самолеты игнорируются. Первая группа хенкелей отрабатывает по радару. Если он уничтожается, сообщения прекращаются.

Ilya Kaiten
21.04.2011, 04:59
Интересно... Я вот всё надеюсь, что нам всё-таки дадут рано или поздно бленхейм, бьюфайтер и москито в ночной версии (там, правда потом ещё и самолётный радар надо будет "рисовать"). И тогда для имитации Британской GCI будет весьма актуально.

Только емнип выдавались не точные координаты, а район нахождения цели и каждый перехватчик выводился на цель индивидуально в стиле "5 км южнее вас на высоте 2000м следует таким-то курсом".

Системы распознавания свой-чужой (по крайней мере на первом этапе войны) не было и селекция отметок была на плечах наземной службы. Как только самолёты сближались и начиналась свалка различить своих и чужих было возможно только по косвенным признакам (отметка вышедшая из боя и ползущая к французскому побережью по всей видимости не брит)

Также, кажется было две или три системы. Одна из них CHL контролировала малые высоты над метрополией и выводила перехватчики в том числе и на неопознанные самолёты, часто оказывавшиеся британскими.

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

P.S
Кстааати... Если не моделировать место оператора радара, то радар ночных истребителей можно также имитировать текстовыми командами. Пилот (исключая одну экспериментальную серию, не пошедшую в производство) самих экранов радара не видел и полностью опирался на подсказки второго члена экипажа - оператора типа "Круто вправо. Ниже на 200м. Дистанция 3км".
Жаль я в шарпе валенок =(

P.P.S.
Была, оказывается, ещё и "наземная служба обнаружения самолётов на очень малых высотах" - CHEL

P.P.P.S
Шесть первых станций CHL GCI (Ground Controlled Intercept) 1940-1941 г
http://www.radarpages.co.uk/mob/images/map2.jpg
Список всех РЛС Британии от Broomberg тут (http://www.sukhoi.ru/forum/showthread.php?t=68400&p=1591503&viewfull=1#post1591503)

Ilya Kaiten
21.04.2011, 11:15
Группы (сектора ПВО) в период Битвы за Британию. Указано Размещение РЛС, штаб квартир, даты размещения эскадрилий на аэродромах.
http://www.raf.mod.uk/bob1940/10group.html

Карта охвата системами CH, CHL в 1939 - 1940гг
http://upload.wikimedia.org/wikipedia/commons/d/de/Chain_home_coverage.jpg

Груда информации по британским радарам
http://www.radarpages.co.uk/

Ilya Kaiten
22.04.2011, 07:57
Немного о бортовых радарах. Как это работало.
Экипаж состоял минимум из 2 человек - пилота и оператора радара. Наведение осуществлялось по командам с земли вплоть до контакта бортового радара с целью. После чего пилот по подсказкам своего оператора выходил на цель и визуально опознавал её (ошибки имели место). Большинство пилотов просили оператора вывести их на цель сзади и несколько ниже. Это позволяло увидеть силуэт на фоне ночного неба и облегчало опознание, кроме того перехватчик оказывался трудно различим для стрелков противника на фоне земли.

AI (Airborne Interception) Mark I и II - моделировать не имеет смысла. Радары были крайне не надёжными их эффективность стремилась к нулю.

AI Mark III - первый сравнительно удачный британский бортовой радар
Макс дальность обнаружения 9.000 футов (2750 м). При том, что примерная погрешность наземных радаров составляла около 5км наведение не всегда заканчивалось захватом цели.
Минимальная дальность обнаружения 1.080 футов (330 м). Обусловлена длинной волны излучателя.

AI Mark IV - первый перехват по наведению - 18 окт 1940 (по другим данным 19 ноября) Бьюфайтер
Макс дальность обнаружения 18.000 футов (~5500 м)
Минимальная дальность обнаружения 300-400 футов (90 - 120 м)
Погрешность ± 5 град

У обоих радаров максимальная дальность обнаружения ограничена высотой полёта. Т.е. на высоте 700 метров дальность обнаружения не может превышать 700 метров. Вызвано это тем, что отражённый от земли сигнал забивает метку цели.

132811 132812

adonys
30.06.2011, 20:27
I've improved the code a little bit, to just signal (enemy) aicraft groups and the dots (airplanes) number in each group.



private void lockTargets()
{
// TO DO: heading, altitude, speed, type

bool hasTargets = false;
int AirGroupNr = 0;

serverMessage("Radar: ping!");
foreach (AiAirGroup airGroup in GamePlay.gpAirGroups(ARMY))
{
Dictionary<AiAirGroup, int> groupsCounter = new Dictionary<AiAirGroup, int>();
bool AirGroupDetected = false;
int AirGroupAircrafts = 0;
string AirGroupSector = "";

foreach (AiActor groupMember in airGroup.GetItems())
{
if (groupMember is AiAircraft)
{
if (RADIUS > groupMember.Pos().distance(ref radarPoint))
{
hasTargets = true;
AirGroupDetected = true;
AirGroupSector = String.Format(" in square {0}", GamePlay.gpSectorName(groupMember.Pos().x, groupMember.Pos().y));
AirGroupAircrafts = AirGroupAircrafts +1;
}
}
}

if (AirGroupDetected)
{
AirGroupNr = AirGroupNr +1;
string msg = String.Format(("Radar: Impulse group {0} with {1} spots"+AirGroupSector), AirGroupNr, AirGroupAircrafts);
serverMessage(msg);
}
}
if (!hasTargets)
{
serverMessage("Radar: No targets found!");
}
}


It should be improved with:
- instead saying the dots number of a group, could say small (1-3 dots), medium (4-10 dots), big (over 10 dots) group size
- altitude, heading, speed (must be checked if the historical radar could report those)
- aircraft types (only when the group is visually spotted by a friendly airgroup and hereby identified)

podvoxx
24.04.2012, 10:01
http://forum.1cpublishing.eu/showpost.php?p=411824&postcount=83

Кодиак сделал свой вариант радара. Насколько я понял можно запрашивать обстановку через меню