Как определить порядок прорисовки в изометрической флеш игре?

12

Это для флеш игры с изометрической проекцией. Мне нужно знать, как сортировать объекты, чтобы не требовалась проверка z-буфера при рисовании. Это может показаться простым, но есть другое ограничение: сцена может иметь более 10000 объектов, поэтому алгоритм должен быть запущен менее чем за 0 (n ^ 2). Все объекты представляют собой прямоугольные коробки, и в сцене движется 3-4 объекта. Какой лучший способ сделать это?

ОБНОВИТЬ

в каждой плитке есть только объект (я имею в виду объекты не могут складываться друг на друга). и мы получаем доступ как к карте объектов, так и объекты имеют свою позицию.

UPDATE2

увидеть эти цифры:

введите описание изображения здесь введите описание изображения здесь

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

примечание: поскольку все объекты представляют собой прямоугольную призму, математически доказано, что существует хотя бы один порядок отрисовки для удовлетворения проблемных задач.

Ali1S232
источник
2
Вы должны опубликовать больше информации. Могут ли объекты складываться (3d)? У объектов есть позиции или на карте есть объекты? и т. д.
КаоД
2
Это то же самое , как gamedev.stackexchange.com/questions/8151/...
Тетрадь
@ Тетрад, да, но есть немного небольшая разница в объектах, которые мы помещаем в сцену.
Ali1S232
@Gajet (после вашего обновления) объекты могут быть только 1 * X и X * 1 или также X * Y? Можете ли вы позволить себе разделить объекты на несколько подобъектов? (например, зеленый - это 4 суб-зеленых объекта) Ориентация объекта фиксирована?
kaoD
Также: сколько смежных плиток скрывает высота вашего объекта?
kaoD

Ответы:

8

Это на самом деле очень просто, если ваши объекты совпадают с вашими изометрическими плитками. Посмотрите на это изображение:

Изометрический порядок рисования

Сначала вы должны нарисовать объект в красной позиции, затем синий, зеленый, желтый, пурпурный и т. Д. Должно быть достаточно очевидно, как это реализовать, если на вашей доске есть объекты вместо объектов. имея положение в качестве атрибута. Если это не ваш случай, вы должны сохранить отдельную структуру данных, обновляя ее всякий раз, когда объект перемещается (что тоже должно быть довольно просто).

Это создает новую проблему: вы можете легко увидеть, как теперь ее сложность составляет O (N), где N - размер вашей платы ( N=W*H). Чтобы преодолеть эту проблему, просто создайте новую линейную структуру данных, где каждый индекс в вашей структуре соответствует определенной глубине, обновляя ее всякий раз, когда объект меняет глубину.

Случай, когда объект не соответствует одной плитке, немного сложнее, поэтому я опубликую его, если он вам понадобится, как только вы обновите свой вопрос.

kaoD
источник
этот алгоритм также был первым, что пришло мне в голову, но посмотрите мое обновление, поэтому вы не можете использовать его без изменений.
Ali1S232
1
@Gajet, и это именно то, что вы должны опубликовать в своем вопросе в первую очередь: P
kaoD
3
Это путь, разделить большие части на «плитки» +1
Valmond
2

У меня нет специальных знаний по этому вопросу, но вот мысль.

Начните с маркировки каждой ячейки как "не нарисованной". (Или, что эквивалентно, используйте массив для представления местоположения ближайшей «нарисованной» вещи на каждой «ближней линии» ячеек или набора и т. Д.) Затем для каждой ячейки (я бы, вероятно, прошел через них в порядок, описанный kaoD): проверьте, была ли нарисована эта ячейка; если он не был нарисован и содержит объект, проверьте, была ли нарисована каждая ячейка, которая была бы скрыта этим объектом, и, если нет, нарисовать ее рекурсивно; рисовать объект, содержащийся в этой ячейке, если это необходимо; и пометьте эту ячейку и любые ячейки, занятые ее объектом, как «нарисованные».

Я предполагаю, что вы можете быстро сопоставить ячейку с объектом внутри нее, если есть. Я полагаю, что это время O (n), хотя это может привести к созданию большого стека (который вы можете превратить в связанный список, если вы беспокоитесь о нехватке места в стеке).

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

Винсент Повирк
источник
Я считаю, что этот алгоритм можно рассматривать как форму топологической сортировки, адаптированной к проблеме; Я как раз собирался смутно указывать в этом направлении сам. Топологическая сортировка является решением большинства проблем упорядочения / зависимости.
Кевин Рейд
1

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

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

Quasiperfect
источник
это может сработать, но я не могу сказать, чем оно отличается от алгоритмов, предложенных byte56 или kaoD. мне кажется, у него все еще есть те же проблемы, которые описаны в моем втором редактировании.
Ali1S232
1

Что заставляет вас верить, что «математически доказано, что существует хотя бы один порядок извлечения для удовлетворения проблемных потребностей»? Вот простой контрпример, в котором нельзя полагаться на объекты z-сортировки:

введите описание изображения здесь

Сэм Хоцевар
источник
Просто из любопытства ... не могли бы вы привести контрпример? Это не сетка.
Каод
хорошо помните, что на каждой плитке есть только один объект, и объект может занимать одну или несколько плиток, но они всегда имеют прямоугольную проекцию на плоскость. этих двух условий достаточно для доказательства этого утверждения.
Ali1S232
Хорошо, с этими ограничениями и тем фактом, что сетка плоская, есть решение. Я опубликую это позже.
Сэм Хоцевар