Здравствуйте все.
Хочу понять принцип создания и работы миникарты в 3D играх от первого лица.
Я саму мини-карту карты(тавтология, но как есть) приаттачиваю к точке крепления на экране танка, миникарта вращается, так как направлен сам танк, всё отлично, но как на ней отобразить нужные мне объекты(игроков, важные места, такие же танки и т.д.).
Если я пытаюсь созданым спрайтом следовать за этой мини-картой, получается совсем нехорошо, каждый тик спрайт нагоняет отставание, потом останавливается(между тиками) и снова догоняет.
Должен быть какой-то другой способ отображения спрайта на мини-карте, без отставания, как то приатачить не к точке, а к плоскости мини-карты что-ли.
Какие есть способы?
И сразу еще один вопрос, не сочтите за наглость, как можно обрезать углы мини-карты, что бы она вращалась как бы внутри квадрата, отсекая углы.
Ортографическая проекция видом сверху, которая двигается вместе с игроком по центру. Необходимые остальные объекты — просто разноцветные точки. Так их и рендеришь.
Первое что пришло в голову
Отдельная камера сверху рисует какой-нибудь рендер-мод сцены и объектов.
Сама текстура карты(для радара) у меня есть, я её накладываю на 3D модель самой миникарты.
Мне нужно по этой текстуре(которая на модели) рендерить игроков и прочее. Проблема в том, что миникарта на танке, танк постоянно двигается, и соответственно все точки(игроки и прочее должны по мини-карте перемещаться)
Я не совсем понял, что значит с игроком по центру? Хотя бы для начала такой вариант решить, без прочего, просто игрок, чья мини-карта пусть будет высвечиваться на ней, поподробнее бы как-то, если можно.
Если я правильно понял, всё будет происходить вокруг игрока? Грубо говоря, игрок на мини-карте стоит на месте, а все крутится и передвигается вокруг него, сама карта естественно тоже?
Но всё равно тогда останется отставание при рендере. И даже если так, а как текстуру карты смещать вокруг игрока?
lookid
> Отдельная камера сверху рисует какой-нибудь рендер-мод сцены и объектов.
Такое в юнити-подобных движках пройдет, а у меня движек source, он только одну камеру тянет.
lookid
> Отдельная камера сверху рисует какой-нибудь рендер-мод сцены и объектов.
Хорошо, а как игроков подсвечивать? Или другие объекты. Не будет же камера их посвечивать, она сделает саму карту сверху(это у меня есть), остаётся показать на этой карте местоположения других игроков.
tonline_kms65
Тут просто проецировать позицию со сцены на карту с масштабом. Берешь xy, без z.
tonline_kms65
> движек source, он только одну камеру тянет.
https://youtu.be/4ddJ1OKV63Q?t=287
Шейдер?
lookid
> Тут просто проецировать позицию со сцены на карту с масштабом. Берешь xy, без z.
Проблема в том, что монитор дрона прикреплён не к монитору(экран компьютера), а закреплён на самом Дроне, т.е. координата z так же двигается.
Если бы понять как закрепить экран монитора дрона на самом экране компьютера(не знаю понятно объясняю или нет), конечно было бы намного легче. Там можно было бы и модель от первого лица свою ставить, да и вообще много что упростилось бы.
Хотя, что-то здесь я возможно недопонимаю, с этими камерами. Даже если я смогу установить камеру в центре экрана компьютера, что это получится?
Я, кстати, уже тему создавал, как и по какому принципу работают камеры, как у них получаются плавные движения. Пока без ответа. Если понять как эти камеры работают, возможно всё встанет на свои места.
Ranma
> https://youtu.be/4ddJ1OKV63Q?t=287
Интересный видос.
Я знаю что можно делать и по 2 и по 3 монитора, сам такое делал, но это при создании карт, в редакторе. Как это сделать программно я не знаю, пробовал - не получилось. Да даже если и получится, толку? Что она будет смотреть? Сверху, как бегают игроки?
tonline_kms65
https://lmgtfy.app/?q=source+engine+create+minimap
:)
Не знаком с движком source, но по идее, если есть координаты всех объектов в пространстве мира, то можно сделать так:
1) Ставим центр карты в 0,0 пространства мира.
2) Игнорируем Y компоненту(высоту).
3) Берем ширину и длину карты в пространстве мира, делаем на основе этого матрицу и высчитываем
обратную матрицу.
4) Далее получаем координаты объектов в нормализованном пространстве миникарты( т.е. x и y от 0 до 1) посредством умножения координат объектов в пространстве мира на обратную матрицу, рассчитанную выше.
6) Теперь рендерим квадратики, треугольнички и что еще угодно на миникарте по полученным координатам, используя текстурные координаты геометрии(3д модели).
UPD: или можно сделать еще проще.
Берутся нормализованные координаты из пункта 4. Строится матрица вида
mX/sX 0 0 pX
0 mY/sY 0 pY
0 0 0 0
0 0 0 1
где mX, mY - размеры миникарты; sX, sY - размеры экрана; pX, pY - вектор между центром экрана и центром миникарты.
Эта матрица умножается на нормализованные координаты (x,y,z,1) из пункта 4. Получаются координаты на экране, по которым нужно отрендерить полигон.
Ranma
Вот бы всегда так просто всё было.
Нет, это совсем не то, это генерация уменьшеннной карты в разрезе, так сказать рендер карты в текстуру, для вывода её на радар(миникарту).
Мне нужен процесс работы программного кода, т. е. как на этой тектуре карты отображаются нужные объекты.
Нет ни одной статьи о программировании миникарты или радара для source, и вообще такого нет нигде, нет исходников на counter-strike:source, есть исходники на HL2, но там, насколько я знаю, радара и миникарты нет.
Нашел слитые(ворованные) исходники csgo, попробую разобраться, как там сделано, там-то точно радар есть.
Kaylent
> Игнорируем Y компоненту(высоту).
И остаётся наш радар в том месте, где его создали, там мигает, вращается и т.д.
В том то и дело что сам экран, на котором расположена миникарта, находится на танке, соответственно при движении танка должна двигаться и карта, вот в чём проблема. Если бы понять как отобразить миникарту на экране монитора игрока(клиента), тогда бы все было проще, но я пока не могу понять как это сделать.
Возможно у меня ошибка при создании объекта(танка), я на танк креплю экран с информацией, а точно посередине экрана закрепляю на танке камеру. Такой FOV получается, ближе к экрану-больше значки, дальше от экрана-значки меньше(значки информации, и так же в виде значка мини-карта).
Тема в архиве.