Доброе всем время суток. Очень нужна помощь. Хочу написать игру в изометрии. Проблема с расчетом глубины (дальности) объектов. http://animbook.mirmap.com/content/view/35/43/ вот тут есть нормальный альгоритм. Только он работает, если весь мир разделен на равные ромбики. А что делать если объект занимает например 3 на 2 клетки????
Итак. Требуется функция, которая зная расположение объектов (координаты i и j по клеточкам) и их ширину по i и ширину по j определяла бы какой из них находится дальше, а какой ближе.
Заранее спасиба!
Объект - материальная точк или имеет некоторую протяженность?
Если точка - проблем нет.
А если имеет протяженность, то ЧТО следует брать в качестве расстояния до него? Самую ближнюю точку? Самую дальнюю точку? Геометрический центр?
Самое интересное, что какой бы из вариантов мы ни выбрали, всегда найдется случай, при котором более удаленный объект ДОЛЖЕН при отображении перекрывать более близкий.
Отсюда напрашивается вывод, на самом деле тебе нужно совсем не то, что ты просишь. (т.е. функцию по заданному критерию написать можно, но она не поможет тебе в правильной отрисовке объектов)
Предлагаю разбивать объекты на фрагменты по одной клетке и уже эти фрагменты отображать в нужном порядке.
Поняятно, я так и думал, что так надо. Протсо если делать так, то будет много других проблем.
Каждый объект - это не точка, а объект, у которого есть ширина по i и ширана по j.
Но мы же визуально можем как то определить какой объект ближе, какой дальше. Нужна как раз эта функция по определению какой объект ближе, а какой дальше (сравние дальности двух объектов)
Возможно можно каким то образом определить каку точку принять за растояние до объекта?? может тоже есть зависимость?
А если ограничить объекты по размеру... Типа ввести ограничение на максимальную ширину и длину объекта???
А возможно узнать эту точку в зависимости от расположения объектов? Т.е. эта точка разная для каждой пары объектов??
Ну точка относительно которой будет считаться глубина объекта. И эта точка будет определятся в зависимости от их расположения
Ладно, я решил тоже отбросить эту идею. И разделить весь мир на тайлики. Тогда подскажите пожалуста, как большоей объект, который занимает много клеток разбить на тайлы??
Тогда вопрос. Какие должны быть объекты чтобы их можно было отсортировать по глубине?? т.е. какие брать эти простейшие объекты?? Может подскажите где взять алгоритм?
С забором согласен, что никак.. Но если принять, что один объект не может быть внутри другого. и все объекты только выпуклые.... можно ли тогда ?? и как?
Хорошо, постараюсь заново задать вопрос конкретно.
Имеется поле I x J клеток в изометрической проекции. Есть набор объектов (объекты только выпуклые, т.е. в матрице ландшафта выглядят как прямоугольники).
Пример объекта, который может быть:
0 0 0 0 0 0 0
0 0 0 * * 0 0
0 0 0 * * 0 0
0 0 0 * * 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 - пусто, * - это объект
Пример объекта, которого быть НЕ может:
0 0 0 0 0 0 0
0 0 0 * * 0 0
0 0 0 * 0 0 0
0 0 0 * * 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Пример расположения объектов:
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 2 0
0 0 0 0 1 1 0 0 0 0 2 0
0 0 0 0 0 0 0 0 0 0 2 0
3 3 3 3 0 0 0 0 0 0 0 0
3 3 3 3 0 0 0 0 0 0 0 0
0 0 0 4 4 4 0 0 0 0 0 0
0 0 0 4 4 4 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
1 - первый объект, 2 - второй, 3 - третий, 4 - четвертый
Вопрос
Можно ли такие объекты отсортировать по глубине?? Можно ли однозначно сказать для 2ух объектов, кто из них ближе, а кто дальше??? и если можно, то как.
1. Можно, если определить, что считать глубиной.
2. Можно, если определить, что такое "ближе" и "дальше" для протяженных объектов. В общем случае это можно сделать только в случае, когда ближайшая точка одного объекта находится дальше дельней точки другого. Во всех остальной существуют варианты.
Поставлю вопрос подругому. Можно ли отсортировать эти объекты по дальности? чтобы получился список объектов по порядку появления их на экране.
Можно уточнить: отсортировать по дальности или отсортировать по прядку отрисовки?
Мне нужно каким то образом расположить объекты на экране. т.е. я сначала должен положить на экран самые дальние объект, а потом те что ближе.... чтобы те что ближе перекрывали, те что дальше. получится массив объектов. и я их размещаю на экране в порядке этого массива:
for i:=0 to Кол-во_объектов -1 do
begin
нарисовать объект;
end
Разве не одно и тоже: сортировка по дальности и порядок отрисовки?? если нет, то чем они отличаются?
Понятно.
Пример с двумя объектами один из которых невыпуклый я уже предлагал.
Можно так расположить 3 выпуклых объекта, что каждый из них будет перекрывать один из двух оставшихся и при этом перекрываться другим.
В каком бы порядке их ни рисовать, одно из пересечений будет отображено неправильно.
Добавлено через 3 мин.
Значит оптимальным решением здесь будет разбивка на тайлы?? или точнее на полоски любой высоты, а шириной в один тайл?? Правильно я понимаю?
И если можно привести пример такого расположения трех объектов, где будет ошибка отрисовки??
Поняятно.... вот наверно так и буду делать. Это все нужно для создания игры типа ресторатора во Flash на ActionScript 3.0
И интересно как ты построишь треугольник из трех прямоугольных объектов, которые распологаются либо вертикально либо горизонтально... не может быть такого:
0 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0
А если все объекты только квадратные?? т.е. занимают n*n клеток и не могут пересекатся. Возможно ли тогда присвоить каждому объекту число (каждому объекту уникальное), которое зависит только от координат расположения объекта (по клеткам) и его ширины и длины (по клеткам), которое бы означало "глубину" данного объекта? и затем по этим "глубинам" отсортировать эти объекты по порядку расположения их на экране??
Смотря откуда смотреть. Если вдоль линии, парралельной сторонам прямоугольников, тогда в качестве контрольной точки можно взять любую точку внутри прямоугольника (не обязательно квадрата). Просто потому, что один прямоугольник может перекрываться другим только тогда,когда он полностью за ним.
Нет... это изометрия 2,5D... т.е. как бы квадрат повернут на 45 градусов. Получается ромб
Если только квадратные и только под 45, вроде, можно взять геометрический центр.
Для либо прямоугольных, либо других углов это будет уже несправедливо.
http://animbook.mirmap.com/im/08/chapter08_html_57845982.jpg
вот такая изометрия. На рисунке показана одна плитка (квадрат 1*1).
Все0таки непонятно, почему рассматриваются именно объекты целиком, а не "плитки". В последнем случае можно было бы избежать множества проблем и ограничений.
Потомучто игра пишется на флеше (ActionScript 3.0) и очень сложно делать анимацию зданий если их разрезать на тайлы.