Stormworks: Build and Rescue – Как создать простой морской радар 1 – steamlists.com

Руководство по созданию радара для тех из нас, кто предпочитает читать

Мне было сложно найти информацию о том, как работает радар в StormWorks. Обнаружив много неверной, устаревшей или неполной информации, я решил написать это руководство, чтобы помочь другим. Я не поклонник загрузки примеров модулей или просмотра руководств на YouTube, и подумал, что могут быть другие люди, которые ищут письменную информацию, чтобы помочь.

Радар, который я создаю в этом руководстве, требует работы с микропроцессорами и LUA. Прежде чем погрузиться в подробности, настоятельно рекомендую ознакомиться со следующими темами:

Разница между числовыми, вкл / выкл, видео и композитными входами Микропроцессоры Основы LUA Как писать текст на ЖК-экраны

Если вы знакомы с этими 4 вещами, будьте готовы погрузиться в радары! Я включил написание текста, потому что это может быть очень полезно при отладке.

В нашем простом руководстве мы сосредоточимся на простом отображении целей на экране.

Базовый радар в StormWorks имеет:

Вход On / Off для включения радара Цифровой выход для отображения значения вращения радара (десятичное значение поворота) Составной выход с информацией о цели

Составной ввод содержит:

8 значений включения / выключения, чтобы показать, была ли обнаружена цель или нет 32 значения, содержащие информацию о цели в группах по 4

Группы по 4 содержат числовые значения для:

Расстояние до цели (м) Азимут цели (от -0,5 до +0,5, при 0,5 – 180 градусов) Высота цели Время с момента обнаружения

Наличие 32 числовых значений означает, что составной поток, покидающий радар, заполнен. Вы не сможете прикрепить к потоку дополнительную информацию без перезаписи данных.

В радиолокационном блоке тоже есть настройки:

Sweep Mode регулирует движение тарелки:

StaticClockwiseAnticlockwiseSweep

Предел развертки устанавливает ширину развертки в режиме развертки. 0,5 повернет блюдо в диапазоне от -180 до 180, а значение 0 ограничит блюдо спереди.

Угол наклона устанавливает угол наклона тарелки вверх / вниз.

FOV X устанавливает ширину луча

FOV Y устанавливает высоту луча

Настройка FOV влияет на эффективный диапазон. Очень маленькое поле зрения будет иметь большой диапазон, но вам будет сложно получить отдачу от целей.

При установке радаров в штормовых сооружениях направление указывается стрелкой, если вы включаете стрелки направления.

Когда мы внедрим радар, мы будем получать от устройства следующую информацию:

DistanceAzimuthElevation Время с момента обнаружения

Нам нужно отобразить эту информацию на квадратном экране. Это потребует от нас преобразования этих пеленгов / расстояний в координаты X и Y. Прежде чем приступить к созданию радара, давайте разберемся, как производить эти преобразования.

Радар выводит азимут в пеленге от -0,5 оборота до 0,5, где 0 соответствует прямому направлению, а 0,5 – 180 градусов. Нам нужно преобразовать это значение в градусы. Мы можем сделать это, умножив значение поворота на 360 градусов:

0,5 * 360 = 180

Но если он отрицательный, мы должны вычесть результат из 360, чтобы получить подшипник:

-0,25 * 360 = -90

-90 + 360 = 270

Пеленг – это угол от 0 (прямо вперед), а диапазон представляет собой гипотенузу треугольника. Зная гипотенузу и угол теоретического прямоугольного треугольника, мы можем найти другие катеты треугольника, которые оказываются точками X и Y на сетке.

hyp * sin (подшипник) = противоположная сторона (положение X)

hyp * cos (азимут) = смежная сторона (положение Y)

Вот визуализация:

Stormworks: Build and Rescue - Как создать простой морской радар - Теория - также известная как Математика - 10664A6

В этом примере мы используем градусы. Но когда мы используем математические функции в LUA, он будет ожидать радианы. Мы конвертируем градусы в радианы, умножая градусы на пи / 180.

Теперь мы можем узнать положение X и Y в метрах относительно антенны радара. Вы можете видеть, как знание этого открывает двери для более сложных вариантов использования.

А теперь давайте сложим некоторые детали и приступим к изготовлению радара!

Для этого примера нам понадобятся:

Базовый радар Экран 2 × 2 Панель приборов Тумблер Батарея

Ставим все, подключив питание к аккумулятору. Затем подключите тумблер включения / выключения к включению / выключению радара и включению / выключению экрана.

На панели приборов установите следующее:

Инструмент 1: нет Инструмент 2: стрелка вверх, канал 1 Инструмент 3: нет Инструмент 4: стрелка вниз, канал 2

Это позволит нам отрегулировать дальность отображения радара.

На радаре установите следующее:

Режим развертки: по часовой стрелке Скорость развертки: 50% Предел развертки: не имеет значения, мы не используем режим развертки Угол наклона: 0FOV X: 0,07FOV Y: 0,07

Это даст нам радар, который вращается по кругу и имеет дальность действия 4897 м.

Создайте микроконтроллер шириной 2 и длиной 2. Добавьте следующие логические узлы:

Композитный вход (вход радара) Видеовыход (выход видео на осциллограф) Number In (значение поворота радара) Композитный вход (вход панели приборов)

В логическом поведении настройте все так:

Stormworks: Build and Rescue - Как создать простой морской радар - Создание радара - 85F16AF

Мы используем приборную панель для увеличения значения диапазона. Затем мы вставляем значение диапазона и значения поворота радара в составной поток данных. Обратите внимание, что в этом примере мы начинаем с составного числа 29, перезаписывая нашу способность принимать полные 8 целей, но позволяя объединить все это в один поток для LUA. Выход LUA идет на видеовыход.

Это потребует некоторого улучшения. Кнопки выбора диапазона будут слишком чувствительными, и мы удаляем потенциальную цель для простоты, но этого будет достаточно для начала. Теперь давайте погрузимся в LUA!

Вот LUA, которую я придумал. Мы используем таблицы для хранения данных радара.

max_tar = 7 – Максимальное количество целей lastRange = 0 lastAz = 0 function onTick () rad_rot = input.getNumber (29) – Диапазон значений поворота радара = input.getNumber (30) – Настройка диапазона экрана радара tar = {} для i = 1, max_tar do table.insert (tar, input.getBool (i)) – Получить целевые данные bool end tarD = {} – Distance tarAz = {} – Azimuth tarEl = {} – Elevation tarTm = {} – Время с момента возврата j = 0 для i = 1, max_tar do table.insert (tarD, input.getNumber (j + 1)) table.insert (tarAz, input.getNumber (j + 2)) table.insert (tarEl, input.getNumber (j + 3)) table.insert (tarTm, input.getNumber (j + 4)) j = j + 4 end end – Функция рисования, которая будет выполняться, когда этот скрипт отображает функцию экрана onDraw () w = screen.getWidth () h = screen.getHeight () rangeRatio = (h / 2) / range – Соотношение для определения положения пикселя относительно текущего значения диапазона – Установить BG screen.setColor (20,20 , 20) screen.drawClear () – Нарисовать область действия screen.setColor (0, 0, 0) screen.drawCircleF (w / 2, h / 2, h / 2 – 1) – Нарисовать развертку линии развертки en.setColor (200,200,200) radRotDeg = (rad_rot * 360)% 360 radRotRad = radRotDeg * (math.pi / 180) – [math.pi] sweepX = h / 2 + ((h / 2 – 1) * math.sin (radRotRad)) sweepY = h / 2 – ((h / 2 – 1) * math.cos (radRotRad)) screen.drawLine (w / 2, h / 2, sweepX, sweepY) – Отрисовка кругов диапазона screen.setColor (26,188,200) screen.drawCircle (w / 2, h / 2, h / 2/3) screen.drawCircle (w / 2, h / 2 , h / 2/3 * 2) – Нарисовать экран, возвращающий радар (цели). setColor (227,222,93) targetCount = 0 для i = 1, max_tar do, если tar, то
азимут = (tarAz * 360)% 360
azRad = азимут * (180 / math.pi) – градусы в радианах

tarX = w / 2 + (tarD * rangeRatio) * math.sin (azRad)
tarY = h / 2 – (tarD * rangeRatio) * math.cos (azRad) – мы вычитаем, так как ось Y направлена ​​вниз
screen.drawCircle (tarX, tarY, 0.5)
lastRange = tarD
lastAz = азимут
targetCount = targetCount + 1
конец
конец

– Рисование интерфейса
screen.setColor (200,200,200)
screen.drawTextBox (1, h-5, w, 4, string.format (“% 0.0f”, диапазон), -1, 0)
screen.drawTextBox (1, 1, w, 4, string.format (“% 0.0f”, lastRange), -1, 0)
screen.drawTextBox (1, 1, w-1, 4, string.format (“% 0.0f”, lastAz), 1, 0)
конец[/code]

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

Каждый тик игры мы считываем данные из составного потока в таблицы.

Изображение на экране – это основа кода. Мы получаем размер экрана, а затем вычисляем коэффициент конверсии на основе диапазона, который выбирает пользователь. Это преобразует метры в пиксели экрана.

Рисуем цвет фона, затем черную круговую область.

Затем рисуем линию развертки. Он преобразует десятичное значение поворота в градусы, вычитая полное число оборотов. Затем значение градуса конвертируется в радианы.

Координаты X и Y вычисляются с использованием триггерных функций, о которых мы говорили ранее, но нам нужно было значение в радианах, чтобы использовать встроенные математические функции. Затем проводится линия развертки от центра экрана к краю круга.

Для чутья рисуем круги дальности.

Теперь о целях. Мы устанавливаем цвет отрисовки, затем перебираем 7 возможных целей, чтобы сначала увидеть, обнаружено ли что-то, а затем наносим это на график.

Мы конвертируем азимут поворота в градусы, а затем в радианы. Затем, таким же образом, как линия развертки, находим положение X и Y. Но обратите внимание, что мы применяем соотношение к диапазону, чтобы преобразовать диапазон из метров в пиксели. Наконец, цель нанесена. Мы также сохраняем расстояние и азимут для отображения на экране.

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

Поместите последний микроконтроллер и разместите для него логические соединения. Надеюсь, теперь у вас есть рабочий морской радар!

Stormworks: Build and Rescue - Как создать простой морской радар - Заключение - CBC6162

Я очень надеюсь, что это было полезно. Я знаю, что LUA может быть трудным на фоне сумасшедшей документации, которая существует. Сообщите мне, если вы обнаружите проблемы или у вас есть предложения по улучшению!

Надеюсь, вам понравится опубликованное нами руководство по Stormworks: Build and Rescue – How to Create Simple Marine Radar; если вы думаете, что мы забыли добавить или нам нужно добавить дополнительную информацию, сообщите нам об этом, оставив комментарий ниже! До скорого!