ПрограммированиеФорумОбщее

Найти точку нажатия курсора на ландшафт (2 стр)

Страницы: 1 2
#15
10:48, 4 сен 2019

Phuntik
Добро пожаловать в iphone. У нас тут гиг/два и жесткая ОС
Каждый бит на счету

Raycast  с треугольниками все таки слишком дорогой, придумал пока более простой способ на основе карты высот, пока он самый оптимальный

#16
10:59, 4 сен 2019

Robotex
Отлично,

Q: как сделать игру?
A: просто возьми треугольники и отрисуй их на экране, а потом напиши логику

Тут вопрос больше не сделать так, что бы работало, а сделать так, что бы работало быстро и адекватно. ДЛЯПРАДАКШЭНА Же

#17
12:46, 4 сен 2019

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

#18
13:10, 4 сен 2019

Robotex
Спасибо. Можно только больше в эту тему спам не писать?

#19
20:47, 4 сен 2019

oxotnik
Один из самых простых, но не самых тормознутых вариантов - идти по 2д лучу с шагом в 1 пиксель. Находить пиксель из карты высот, на лету создавать треугольники для этого пикселя и проверять с ними. Что-то в духе:

bool IntersectHeightMap(vec3 rayOrigin, vec3 rayDirection, vec3& Intersection) {
  vec2 ro = rayOrigin;
  vec2 rd = normalize( rayDirection.xy ); //но лучше проверить, что луч не вертикальный
  vec2 p = ro;
  for (int i = 0; i < 10000; i++) {
    p += rd;
    if ( IsOutsideHeightMap(p) ) return false;
    if (CheckIntersection( floor(p.x), floor(p.y),  rayOrigin, rayDirection, Intersection)) return true;
    if (CheckIntersection( floor(p.x), ceil(p.y),  rayOrigin, rayDirection, Intersection)) return true;
    if (CheckIntersection( ceil(p.x), floor(p.y),  rayOrigin, rayDirection, Intersection)) return true;
    if (CheckIntersection( ceil(p.x), ceil(p.y),  rayOrigin, rayDirection, Intersection)) return true;
  }
}

bool CheckIntersection(int PixelX, int PixelY, vec3 rayOrigin, vec3 rayDirection, vec3& Intersection) {
  // тут построить треугольники для пикселя PixelX PixelY, и проверить пересечение с лучом
}

Понятно, что по прежнему будут лишние проверки, но их будет наааамного меньше, чем в случае с перебрать все треугольники

#20
21:23, 4 сен 2019

MrShoor
> но их будет наааамного меньше
для count=n*n; sqrt(count) максимум

#21
23:34, 4 сен 2019

А вариант с дополнительным фреймбуфером на две компоненты для интерполированных непреобразованных X и Y?

#22
10:41, 5 сен 2019

Dmitry_Milk
glRead надо будет делать, а это синк, а это очень плохо
MrShoor
Как раз и этот вариант начал делать, только чуть более оптимизированый вариант, без треугольника.
+ можно на мип-мапах оптимизировать, и сначала на высоких лодах проверять

#23
14:33, 5 сен 2019

MrShoor
> идти по 2д лучу с шагом в 1 пиксель
Если у ландшафта есть предельная крутизна склонов, то это можно сильно ускорить - проверять высоту текущей точки над ландшафтом и вычислять соответствующий шаг.
oxotnik
> Хитрая математика через карту высот рассчитать точку. Минусы: не осилил хитрую
> математику, нужно хранить карту высот
Я это сильно давно делал на VB6+DX8.

+ Работающий код:

Тут вместо карты высот высота берётся прямо из вертексного буфера: vBuf(ix, iz).Pos.y
MinX и MinZ - координаты узла ландшафта с индексом (0, 0).
ScaleXZ - шаг сетки.

#24
15:42, 5 сен 2019

Mikle
Ага, так и начал делать, только еще и по мипмапам прохожусь (+мипмапы хитрые, вместо интерполированного значения, хранят max четырех)

#25
20:16, 5 сен 2019

Mikle
> Если у ландшафта есть предельная крутизна склонов, то это можно сильно ускорить
> - проверять высоту текущей точки над ландшафтом и вычислять соответствующий
> шаг.
Еще можно minmax mip-ов настроить. Т.е. постоянно уменьшать ландшафт в 2 раза, записывая в пиксель мипа минимальное и максимальное значение из 4-х соседей. Так можно еще сильнее ускорить вне зависимости от крутизны склонов.

#26
11:46, 6 сен 2019

MrShoor
а зачем min  хранить?

#27
16:01, 6 сен 2019

Можно попробовать сгенерить индексы треугольников для 2D-массива. Типа 2D-вокселизатор индексов. Ячейка массива хранит все индексы треугольников попавших в него после проекции и проверки пересечения с сеткой 2D-массива. Если индексы отсутствуют, то там или пропасть или конец уровня. На видео вид сверху:

+ Показать

2D-массив можно настроить таким образом, что в ячейке будет всего 5-10 индексов треугольников, которые можно проверить очень быстро.

#28
18:34, 6 сен 2019

oxotnik
> а зачем min  хранить?
Чтобы снизу можно было тоже ткнуть в ландшафт

Страницы: 1 2
ПрограммированиеФорумОбщее

Тема в архиве.