Помощь - Поиск - Пользователи - Календарь
Полная версия: Изометрия 2,5
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
kosyak
Доброе всем время суток. Очень нужна помощь. Хочу написать игру в изометрии. Проблема с расчетом глубины (дальности) объектов. http://animbook.mirmap.com/content/view/35/43/ вот тут есть нормальный альгоритм. Только он работает, если весь мир разделен на равные ромбики. А что делать если объект занимает например 3 на 2 клетки????
Итак. Требуется функция, которая зная расположение объектов (координаты i и j по клеточкам) и их ширину по i и ширину по j определяла бы какой из них находится дальше, а какой ближе.

Заранее спасиба!
andriano
Объект - материальная точк или имеет некоторую протяженность?
Если точка - проблем нет.
А если имеет протяженность, то ЧТО следует брать в качестве расстояния до него? Самую ближнюю точку? Самую дальнюю точку? Геометрический центр?
Самое интересное, что какой бы из вариантов мы ни выбрали, всегда найдется случай, при котором более удаленный объект ДОЛЖЕН при отображении перекрывать более близкий.

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

Предлагаю разбивать объекты на фрагменты по одной клетке и уже эти фрагменты отображать в нужном порядке.
kosyak
Поняятно, я так и думал, что так надо. Протсо если делать так, то будет много других проблем.
Каждый объект - это не точка, а объект, у которого есть ширина по i и ширана по j.
Но мы же визуально можем как то определить какой объект ближе, какой дальше. Нужна как раз эта функция по определению какой объект ближе, а какой дальше (сравние дальности двух объектов)
kosyak
Возможно можно каким то образом определить каку точку принять за растояние до объекта?? может тоже есть зависимость?
kosyak
А если ограничить объекты по размеру... Типа ввести ограничение на максимальную ширину и длину объекта???
andriano
Цитата(kosyak @ 8.12.2009 13:20) *

Возможно можно каким то образом определить каку точку принять за растояние до объекта?? может тоже есть зависимость?

Нельзя.
Никак невозможно подобрать ЕДИНСТВЕННОЕ число для каждого объекта, чтобы по нему можно было определить порядок отрисовки.
Попытка использовать единственное расстояние для протяженного объекта в данной задаче - тупик.
kosyak
А возможно узнать эту точку в зависимости от расположения объектов? Т.е. эта точка разная для каждой пары объектов??
andriano
Цитата(kosyak @ 9.12.2009 0:01) *

А возможно узнать эту точку в зависимости от расположения объектов? Т.е. эта точка разная для каждой пары объектов??

Какая "эта" толчка?

Цитата
А возможно узнать эту точку в зависимости от расположения объектов? Т.е. эта точка разная для каждой пары объектов??

Ты тут приводил ссылку на какую-то статью. Я туда не заглядывал, но подозреваю, что там рассмотрено именно в условиях ограничения, что размер не превосходит одной клетки.
kosyak
Ну точка относительно которой будет считаться глубина объекта. И эта точка будет определятся в зависимости от их расположения
Гость
Ладно, я решил тоже отбросить эту идею. И разделить весь мир на тайлики. Тогда подскажите пожалуста, как большоей объект, который занимает много клеток разбить на тайлы??
andriano
Цитата(kosyak @ 9.12.2009 10:26) *

Ну точка относительно которой будет считаться глубина объекта. И эта точка будет определятся в зависимости от их расположения
Можно ввести такую точку для каждой из "клеточек" объекта. Т.е. все возвращаетсмя на круги своя.

Представь, что у нас есть некоторая постройка, окруженная забором. Очевидно, построка должна загораживать заднюю часть забора, но передняя часть забора должна загораживать постройку. Очевидно, как бы мы не "крутили" точки, ничего путного мы не получим. Да и вообще, оба возможных порядка отрисовки этих двух объектов целиком приедут к неверному изображению.
Откуда вывод: сложные объекты НЕОБХОДИМО отображать по частям.
andriano
Цитата(Гость @ 9.12.2009 12:35) *

Ладно, я решил тоже отбросить эту идею. И разделить весь мир на тайлики. Тогда подскажите пожалуста, как большоей объект, который занимает много клеток разбить на тайлы??

Не на тайлы, а на фрагменты.
Простейший случай - разрезать по границам клеток.
Гость
Тогда вопрос. Какие должны быть объекты чтобы их можно было отсортировать по глубине?? т.е. какие брать эти простейшие объекты?? Может подскажите где взять алгоритм?
Гость
С забором согласен, что никак.. Но если принять, что один объект не может быть внутри другого. и все объекты только выпуклые.... можно ли тогда ?? и как?
andriano
Цитата(Гость @ 9.12.2009 21:37) *
Тогда вопрос. Какие должны быть объекты чтобы их можно было отсортировать по глубине?? т.е. какие брать эти простейшие объекты??
Точечные (не имеющие протяженности). В общем случае - только так. И именно этот факт служит основой алгорима построения сцены с помощью Z-буфера.
Но существует масса частных случаев, когда можно оперировать протяженными объектами. Например, объекты, вписанные в ячейки сетки. Тогда за "ту самую точку" можно брать центр клетки.
Цитата
Может подскажите где взять алгоритм?
Алгоритм чего?
Цитата(Гость @ 9.12.2009 21:38) *
С забором согласен, что никак.. Но если принять, что один объект не может быть внутри другого. и все объекты только выпуклые.... можно ли тогда ?? и как?
Забор - лишь простейший и наиболее наглядный случай. Можно привести случаи 3 и более объектов.
Ты спрашиваешь, "можно ли?", но не заканчиваешь вопрос. Можно ли что? Собственно в этом я вижу основную проблему - ты не даешь себе труда сформулировать, чего же ты хочешь. А если бы попытался - сам бы нашел ответы на половину своих вопросов. А на оставшиеся - мы бы помогли. Ну или сообщили, что на данном этапе развития науки это невозможно ;).
Попытайся задавать конкретные вопросы. Поверь, то, что ты не дописываешь и держишь у себя в уме, никому кроме тебя не известно. Гораздо проще тебе написать в вопросе на 2-3 слова больше, чем мне в нескольких абзацах пытаться перебрать все варианты того, что ты мог иметь в виду.
kosyak
Хорошо, постараюсь заново задать вопрос конкретно.

Имеется поле 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ух объектов, кто из них ближе, а кто дальше??? и если можно, то как.
andriano
1. Можно, если определить, что считать глубиной.
2. Можно, если определить, что такое "ближе" и "дальше" для протяженных объектов. В общем случае это можно сделать только в случае, когда ближайшая точка одного объекта находится дальше дельней точки другого. Во всех остальной существуют варианты.
kosyak
Поставлю вопрос подругому. Можно ли отсортировать эти объекты по дальности? чтобы получился список объектов по порядку появления их на экране.
andriano
Можно уточнить: отсортировать по дальности или отсортировать по прядку отрисовки?
kosyak
Мне нужно каким то образом расположить объекты на экране. т.е. я сначала должен положить на экран самые дальние объект, а потом те что ближе.... чтобы те что ближе перекрывали, те что дальше. получится массив объектов. и я их размещаю на экране в порядке этого массива:

for i:=0 to Кол-во_объектов -1 do
begin
нарисовать объект;
end

Разве не одно и тоже: сортировка по дальности и порядок отрисовки?? если нет, то чем они отличаются?
andriano
Понятно.
Пример с двумя объектами один из которых невыпуклый я уже предлагал.
Можно так расположить 3 выпуклых объекта, что каждый из них будет перекрывать один из двух оставшихся и при этом перекрываться другим.
В каком бы порядке их ни рисовать, одно из пересечений будет отображено неправильно.

Добавлено через 3 мин.
Цитата(kosyak @ 10.12.2009 19:53) *
Разве не одно и тоже: сортировка по дальности и порядок отрисовки?? если нет, то чем они отличаются?
Нет.
Какую бы точку мы ни приняли за опорную (ближнюю, дальнюю, среднюю), можно придумать пример, когда более далекий объект будет перекрывать более близкий.
kosyak
Значит оптимальным решением здесь будет разбивка на тайлы?? или точнее на полоски любой высоты, а шириной в один тайл?? Правильно я понимаю?

И если можно привести пример такого расположения трех объектов, где будет ошибка отрисовки??
andriano
Цитата(kosyak @ 10.12.2009 21:44) *
Значит оптимальным решением здесь будет разбивка на тайлы?? или точнее на полоски любой высоты, а шириной в один тайл?? Правильно я понимаю?
Трудно рассуждать об оптимальности, не зная всех особенносей конкретной задачи.
На основании того, что мне известно, и того, как я тебя понял (т.е. тайлом ты называешь фрагмент объекта, обрезанный по границам клетки), я не вижу ротивопоказаний.
Т.е. этот вариант реализуем.
Цитата


И если можно привести пример такого расположения трех объектов, где будет ошибка отрисовки??
Увы, не понял, как здесь вставляются картинки в сообщения.
Поэтому на словах: представь треугольник, сколоченный из трех досок так, что каждая из них проходит под предыдущей по часовой стрелке и над следующей.
kosyak
Поняятно.... вот наверно так и буду делать. Это все нужно для создания игры типа ресторатора во Flash на ActionScript 3.0

И интересно как ты построишь треугольник из трех прямоугольных объектов, которые распологаются либо вертикально либо горизонтально... не может быть такого:

0 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0
andriano
Цитата(kosyak @ 10.12.2009 22:14) *
И интересно как ты построишь треугольник из трех прямоугольных объектов, которые распологаются либо вертикально либо горизонтально... не может быть такого:
Да, думаю, ограничение на геометрию, при котором все объекты располагаются на одной плоскости и не могут нависать друг над другом, исключает невозможность вычисления правильного порядка отрисовки.
Но это не общий случай, а именно случай ограничений на геометрию и взаимное расположение объектов.
kosyak
А если все объекты только квадратные?? т.е. занимают n*n клеток и не могут пересекатся. Возможно ли тогда присвоить каждому объекту число (каждому объекту уникальное), которое зависит только от координат расположения объекта (по клеткам) и его ширины и длины (по клеткам), которое бы означало "глубину" данного объекта? и затем по этим "глубинам" отсортировать эти объекты по порядку расположения их на экране??
TarasBer
Смотря откуда смотреть. Если вдоль линии, парралельной сторонам прямоугольников, тогда в качестве контрольной точки можно взять любую точку внутри прямоугольника (не обязательно квадрата). Просто потому, что один прямоугольник может перекрываться другим только тогда,когда он полностью за ним.
kosyak
Нет... это изометрия 2,5D... т.е. как бы квадрат повернут на 45 градусов. Получается ромб
andriano
Если только квадратные и только под 45, вроде, можно взять геометрический центр.
Для либо прямоугольных, либо других углов это будет уже несправедливо.
kosyak
http://animbook.mirmap.com/im/08/chapter08_html_57845982.jpg

вот такая изометрия. На рисунке показана одна плитка (квадрат 1*1).
andriano
Все0таки непонятно, почему рассматриваются именно объекты целиком, а не "плитки". В последнем случае можно было бы избежать множества проблем и ограничений.
kosyak
Потомучто игра пишется на флеше (ActionScript 3.0) и очень сложно делать анимацию зданий если их разрезать на тайлы.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.