forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Изометрия (http://forum.boolean.name/showthread.php?t=16793)

pax 14.05.2012 14:49

Изометрия
 
В общем нарисовал я статическую изометрическую карту. Дело дошло до перемещаемых объектов и я застрял.
Поделитесь мнением, как правильно отрисовывать карту с динамически перемещаемыми объектами. Простой способ по матрице походу уже не подходит... наверное надо как-то все видимые тайлы сортировать по глубине?

Mr_F_ 14.05.2012 14:58

Ответ: Изометрия
 
насколько мне помнится, самый простой способ сортировки в изометрии это по вертикальной экранной оси. объект ниже всегда перекрывает объект выше (такова изометрия), я делал так, вроде всё ок работало.

pax 14.05.2012 15:14

Ответ: Изометрия
 
А относительно каких точек сравнивать положения объектов?

Мой первый тест - выделение от курсора двигается на 1 клетку, на 0,5 смещаются координаты на другую клетку и она проявляется.
http://shgames.ru/unity/marbels/

В идеале я хочу иметь возможность создания карт по сложности похожих на OTTD http://open.ttdrussia.net/ но это мечта, для начала хватит простых возможностей.

Mr_F_ 14.05.2012 16:00

Ответ: Изометрия
 
Цитата:

А относительно каких точек сравнивать положения объектов?
я сравнивал центры.
а вообще чего бы тебе не рендерить честное 3д с з-буффером в изометрии?
может на землю юзать 3д, а шарики обычными спрайтами, ориентированными на камеру?

pax 14.05.2012 16:05

Ответ: Изометрия
 
Так оно проще, но это не путь самурая) Если не смогу решить в ближайшие дни эту проблему, то может так и поступлю, но не хотелось бы.

Igor 14.05.2012 21:46

Ответ: Изометрия
 
Вложений: 1
Цитата:

карт по сложности похожих на OTTD
Мне кажется, там всё по клеточкам.
Будем считать, что А<B если B загораживает A и его надо рисовать позже.
Объекты прямоугольные, ситуации типа (А>B и B>C и C>A) невозможны.
Т.е., можно придумать такой порядок рисования, при котором все объекты будут правильно друг друга перекрывать.
На картинке мы пробегаемся по столбцам и получаем информацию:
С>B>A и E>C>D
(A и D) и (B и D) не имеют общих столбцов, поэтому порядок рисования не всегда важен.
E>C>B>A
С>D
значит, рисовать можно в таком порядке: А,В,D,C,E

Проще говоря, у нас есть массив элементов, который надо упорядочить. При сравнении любых двух мы получаем один их 3 вариантов ответа - "больше", "меньше" или "не имеет значения"

UPD: для варианта "не имеет значения" можно придумать критерий сравнения, чтобы в результате получать ответы вида (А>B) или (A<B) и сортировать стандартными методами

YellowAfterlife 14.05.2012 21:58

Ответ: Изометрия
 
Хранить списки объектов для прорисовки разбитые по глубинам (в данном случае - видимом Y клеток).
То есть при передвижении объекта проверяется, не перешел ли он на новую "глубину", и если так, то он перебрасывается в нужный список либо сразу, либо в конце кадра (тогда добавляется "список заданий" смены глубины объектов).
В JavaScript-"каркасе" (движке) Tululoo такой принцип используется для общей организации сортировки по глубине.
Так как исходный код JS части "открыт", и имеет нехитрые условия использования, ничто не мешает с ним ознакомится.

pax 15.05.2012 08:37

Ответ: Изометрия
 
Я тоже задумался об отдельном списке тайлов на вывод с сортировкой по глубине, надо правильно эту глубину посчитать

YellowAfterlife 15.05.2012 22:29

Ответ: Изометрия
 
Цитата:

Сообщение от pax (Сообщение 228011)
Я тоже задумался об отдельном списке тайлов на вывод с сортировкой по глубине, надо правильно эту глубину посчитать

Формула просчета глубины объекта\ячейки, для системы что рисует от наибольшей глубины к наименьшей, выглядит как
Код:

depth = -z - y * maxz
Где,
z - поднятость "над уровнем земли" (для много-этажных блоков, прочего).
y - "видимая" координата по вертикали (насколько вниз по экрану отдален объект\клетка). Логичным было бы считать это лишь с точностью до половины вертикального размера изометрической клетки (т.е. по 2 значения y на каждую "строку" клеток).
maxz - "лимит" значений z (т.е. если z = 0..255, maxz = 256).
Так же можно заменить уножение на сдвиг в сторону старших разрядов для малой оптимизации.

RegIon 25.07.2014 19:32

Ответ: Изометрия
 
Вложений: 1
Никак не могу нормально отсечь углы на изометрической карте, типо так должно быть:



Проблема в том, что массив сам по себе 200*200*5 и сравнивать ооочень накладно.
Я просчитал минимальный ромб, который попадает в экран, но углы занимают сравнимую с ним площадь (рисую 200 тайлов в экран, и 200 за него - нагрузочно )

пытался сделать так:
PHP код:

--минимальные и максимальные значения индексов рисуемого массива (минимальный ромб)
fromI,_=screenToIso(0,0
toI,_=screenToIso(SW,SH)
dx,fromJ=screenToIso(SW,0)
_,toJ=screenToIso(0,SH)

dx math.abs(dx fromI) --длина от вершины ромба до угла экрана (по x в изо)
lx math.abs(toI-fromI) -- кол-во элементов в грани ромба

for i=fromI,toI do

        
local sY dx-i
        local eY 
-(lx dx)             
        if(
i>dxthen sY i-dx end
        
if(i>lx-dxthen eY = (lx-dx)-i end
         
        
for j=fromJ+sYtoJ eY do
             --
отрисовка
       end  
end 

но почему-то рисуемая область не смещается при скролинге в право и вверх, а только в лево и вниз (screenToIso учитывает скролл карты)

Вложение 20750

как нормально математически отсечку сделать?

Nikich 25.07.2014 21:40

Ответ: Изометрия
 
Сделай функции перевода из изометрической в прямоугольную систему и наоборот. Тогда сможешь юзать логику прямоугольной, а затем переводить в изометрию.

RegIon 26.07.2014 07:13

Ответ: Изометрия
 
screenToIso и isoToScreen - перевод координат, но рисуется ведь ромб на прямоугольник, пока мы переведем и все координаты ромба в мировые и проверим их вхождение, то пройдет 200000 интераций в одном вызове draw, я знаю что можно математически отсечь лишнии интерпции, уменьшая пределы одного из циклов(это как интеграл считать,только я запутался с пределами)

Nikich 26.07.2014 22:03

Ответ: Изометрия
 
Ты меня, видимо, не так понял.
Вот, что я имел ввиду:
https://dl.dropboxusercontent.com/u/...iso/index.html

RegIon 27.07.2014 06:48

Ответ: Изометрия
 
Ну так это есть, я спросил про оптимизацию отрисовки

pax 27.07.2014 10:52

Ответ: Изометрия
 
А тебе обязательно ромбическая карта? Можно хранить карту в виде двухмерного массива, в котором чередуются ряды со смещением (метод zigzag).



Тогда нарисовать квадратную область можно довольно просто. Для ромбической карты придется использовать массив с высотой и шириной равный диагонали ромбической карты.
Собственно ты можешь хранить копию карты в двух массивах для вычислений и отрисовки... правда это потребует больше памяти.

Если захочешь потом хексы, то их тоже так рисовать можно:


Часовой пояс GMT +4, время: 19:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot