Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Custom tile picking

Custom tile picking

Поделиться
Джек АллигаторПостоялецwww1 ноя. 201721:22#0
Продолжаю делать стратежку со сферической картой.
Вместо тысячи слов:
+ custom tiles

Почему кастомные, а не гексы - потому что в результате получаются не только гексы, но и 12 пятиугольников на местах исходных вершин икосаэдра.
Задача - определить id тайла под курсором. Тайлов 655362(восьмой уровень разбиения икосаэдра).
Я бы очень обрадовался, будь простой формульный способ определить тайл.
Но пока не нашел ничего лучше классического color picking - когда рендерят объекты в fbo, в качестве цвета закраски установив id ноды.
И всё бы хорошо, но жрет ресурсов немерянно.
Даже после всех оптимизаций сажает фпс и жрет 150мб памяти гпу.
Притом всё это тратится на атрибуты, т.е. уменьшение вьюпорта до 100х100 через glScissor почти не дает никакого выигрыша в фпс и тем более не экономит память.

Были мысли как-то через сферические координаты нахимичить, но не представляю как конвертить (x,y) экранные декартовые в сферические.
Ещё думаю сэкономить на точности координат везде где это возможно, а то пока по дефолту стоит f32.

Какие ещё способы предложите?
Интересуют принципиально иные способы, потому как color picking, как мне кажется, не самый оптимальный.

Правка: 1 ноя. 2017 21:28

БаберПостоялецwww1 ноя. 201721:34#1
Посчитай при помощи матриц
glasmПользовательwww1 ноя. 201721:46#2
сначала разбей сетку виртуально на порции, например икосаэдр 4го или 5го уровня
потом ищем пересечение с мегагексами (4й/5й ур.) по описанной сфере из центра каждого мегагекса
найдя нужный продолжаем искать уже по маленьким в данном секторе также по описанным сферам
upd для ещё большего ускорения можно дважды разбить поиск, например 4 > 6 > 8

2й способ: создаём массив приближенных целочисленных значений вертикального угла каждой ячейки
далее в каждую ячейку загоняем массив целочисленных значений угла относительно вертикальной оси
получится двумерный массив, в котором будут храниться ссылки на гексы
чтоб найти гекс нужно будет сферические координаты клика привести к целочисленным для поиска по массиву
также нужно будет скорректировать значение сравнив с соседними ячейками

Правка: 1 ноя. 2017 21:57

MrShoorУчастникwww1 ноя. 201721:58#3
Джек Аллигатор
> Какие ещё способы предложите?
Сделать рейкаст в сферу. По координатам на сфере надо найти треугольник исходного икосаедра, типа вот треугольник:
triangle | Custom tile picking
Далее в этом треугольнике считаешь барицентрические координаты для своей точки, и округляешь их (до точности, соответствующей количеству разбиений. Например для 16 разбиейний округляешь до 1/16). Попадаешь в одну из вершин треугольников:
triangle2 | Custom tile picking
Которая по совместительству является центром одного из твоих гексов/пятиугольников. Округляешь полученное float значение до некоторого fixed point, и идешь в хешмапу, из которой достаешь по центру гекса его ID

Правка: 1 ноя. 2017 22:02

MrShoorУчастникwww1 ноя. 201722:04#4
Дополнение.
Как найти соотвтествующий треугольник в исходном икосаэдре.
1. Пускаем луч в сферу, находим точку пересечения со сферой.
2. Берем эту точку, и пускаем из неё луч в центр сферы, и ищем пересечение с одним из 20 треугольников икосаэдра.
Джек АллигаторПостоялецwww1 ноя. 201722:17#5
Бабер
glasm
MrShoor
Спасибо! Идеи понял, буду экспериментировать.

Ещё пришла идея предельной оптимизации color picking - предзаписать id тайлов в текстуру и рендерить её на менее деталлизованной сфере.
Но тут тоже надо экспериментировать - не понятно, хватит ли точности и не будет ли потребление памяти идентичным.

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр