Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.02.2010, 20:19
Maestro13 вне форума Посмотреть профиль Отправить личное сообщение для Maestro13 Найти все сообщения от Maestro13
  № 1  
Ответить с цитированием
Maestro13

Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
По умолчанию Алгоритм z-сортировки объектов

Всем доброго времени суток!

Подскажите, возможно ли реализовать алгоритм z-сортировки объектов в изометрическом поле, если объект занимает более одной клетки на поле. Целый день промучился, так и не смог сделать! Помогите с решением!

Старый 03.02.2010, 21:12
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
проще всего разрезать на несколько клеток.
__________________
мой пустой блог

Старый 03.02.2010, 21:57
lowka вне форума Посмотреть профиль Отправить личное сообщение для lowka Найти все сообщения от lowka
  № 3  
Ответить с цитированием
lowka

Регистрация: Sep 2006
Сообщений: 256
Либо за каждым объектом делать область из нескольких непроходимых клеток. В этом случае резать ничего не придется.
__________________
:emocry:

Старый 03.02.2010, 23:55
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
2lowka: ты нее понял суть проблемы. Проблема в правильной сортировке объектов - какой объект какой заслоняет.
__________________
мой пустой блог

Старый 04.02.2010, 00:56
Maestro13 вне форума Посмотреть профиль Отправить личное сообщение для Maestro13 Найти все сообщения от Maestro13
  № 5  
Ответить с цитированием
Maestro13

Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
В google искал, ничего подобного найти не смог... Разрезать на несколько клеток конечно можно, но хотелось бы все-таки сделать без разрезания(если это возможно)

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

Старый 04.02.2010, 01:32
lowka вне форума Посмотреть профиль Отправить личное сообщение для lowka Найти все сообщения от lowka
  № 6  
Ответить с цитированием
lowka

Регистрация: Sep 2006
Сообщений: 256
Цитата:
Сообщение от iflamberg Посмотреть сообщение
2lowka: ты нее понял суть проблемы. Проблема в правильной сортировке объектов - какой объект какой заслоняет.
Понял. Но так как в первом сообщении все очень скупо(нет никаких ограничений - а они нужны т.к. зачем тратить время на реализацию ИЗЛИШНЕГО функционала) предложил мой вариант. Если прибегнуть к тому, что я написал не нужно резать объекты, и сортировка будет работать простейшая по (x+y) - правда этот метод работает в случае, если размер подвижных объектов 1 клетка, а для статических сколько угодно.
__________________
:emocry:

Старый 04.02.2010, 01:40
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
если это возможно
Это точно возможно для параллельно стоящих параллелепипедов, даже c произвольными размерами без сетки.
Вопрос в том, сколько на это уйдет времени процессора.

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

Я делал по другому:
- пишем функцию сравнения 2-х объектов
в данном случае она выдает 3 результата - "1-й перед 2-м", "2-й перед первым", "не_известно". В этой функции придется учитывать не только координаты, но и размеры объектов
- сортируем пузырьком - почему-то только этот метод работал
но вместо сравнения используем эту функцию, если возвращает "не_знаю" - просто ничего с объектами не делаем - идем дальше.
Все.

Еще есть способы:

- Трюки с точками привязки изображений объектов (не работает для длинных и низких объектов)
http://www.openspace-engine.com/

- Глава "SortingAlgoritm" из книги "ActionScript for Multiplayer Games and Virtual Worlds" (сам не проверял)

P.S. Ну и если будут сильные траблы, на худой конец можно все порезать на кусочки или понаделать непроходимых областей за сложными объектами
P.S.2. Если все объекты имеют квадратную форму(1x1, 2x2, 3x3), то можно сортировать чисто по z-координате центра - все будет работать


Последний раз редактировалось expl; 04.02.2010 в 01:53.
Старый 04.02.2010, 01:56
lowka вне форума Посмотреть профиль Отправить личное сообщение для lowka Найти все сообщения от lowka
  № 8  
Ответить с цитированием
lowka

Регистрация: Sep 2006
Сообщений: 256
Цитата:
Сообщение от Maestro13 Посмотреть сообщение
В google искал, ничего подобного найти не смог... Разрезать на несколько клеток конечно можно, но хотелось бы все-таки сделать без разрезания(если это возможно)
Хотите, что все было честно*? Если да, то
- в случае, когда вывод спрайтами, то только резать.
- если не резать, только вывод в битмап - очень геморный алгоритм. когда искал решение этой же задачи нашел его на каком-то XNA форуме, но оно того не стоит, поверьте.

* - Т.е. все объекты полностью перекрывают друг друга, а оно вам точно надо? Просто везде где это есть - перекрытые объекты либо рисуются еще раз поверх всего, но с пропуском 1 пикселя (baldur's gate, icewind dale и др.) или во круг главного объекта "стираются" заслоняющее его объекты (fallout).

Если вам нужно общее решение - то только резать. А если нет, то нужны дополнительные данные т.е. какие объекты могут занимать больше 1 клетки и проч. ? это действительно важно.
__________________
:emocry:

Старый 04.02.2010, 12:27
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 9  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
не обязательно физически разрерать. Нужно, чтобы в сорировке учитывалось, что один объект занимает несколько индексов глубины, вот и всё.
__________________
мой пустой блог

Старый 04.02.2010, 17:41
Maestro13 вне форума Посмотреть профиль Отправить личное сообщение для Maestro13 Найти все сообщения от Maestro13
  № 10  
Ответить с цитированием
Maestro13

Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
Цитата:
Если вам нужно общее решение - то только резать. А если нет, то нужны дополнительные данные т.е. какие объекты могут занимать больше 1 клетки и проч. ? это действительно важно.
Все статические объекты могут быть произвольного размера и высоты, но прямоугольные(тоесть 2*3 или 4*8 или 5*5 или 1*1 и.т.д) динамические же объекты все 1*1. Уровень земли у всех объектов одинаковый. Объекты выводятся спрайтами

Добавлено через 1 минуту
expl, я не совсем понял ваш алгоритм, можно поподробнее

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.