Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ Изометрия 2,5

Автор: kosyak 8.12.2009 15:39

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

Заранее спасиба!

Автор: andriano 8.12.2009 16:41

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

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

Предлагаю разбивать объекты на фрагменты по одной клетке и уже эти фрагменты отображать в нужном порядке.

Автор: kosyak 8.12.2009 16:45

Поняятно, я так и думал, что так надо. Протсо если делать так, то будет много других проблем.
Каждый объект - это не точка, а объект, у которого есть ширина по i и ширана по j.
Но мы же визуально можем как то определить какой объект ближе, какой дальше. Нужна как раз эта функция по определению какой объект ближе, а какой дальше (сравние дальности двух объектов)

Автор: kosyak 8.12.2009 17:20

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

Автор: kosyak 8.12.2009 21:44

А если ограничить объекты по размеру... Типа ввести ограничение на максимальную ширину и длину объекта???

Автор: andriano 9.12.2009 1:32

Цитата(kosyak @ 8.12.2009 13:20) *

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

Нельзя.
Никак невозможно подобрать ЕДИНСТВЕННОЕ число для каждого объекта, чтобы по нему можно было определить порядок отрисовки.
Попытка использовать единственное расстояние для протяженного объекта в данной задаче - тупик.

Автор: kosyak 9.12.2009 4:01

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

Автор: andriano 9.12.2009 12:57

Цитата(kosyak @ 9.12.2009 0:01) *

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

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

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

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

Автор: kosyak 9.12.2009 14:26

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

Автор: Гость 9.12.2009 16:35

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

Автор: andriano 9.12.2009 23:21

Цитата(kosyak @ 9.12.2009 10:26) *

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

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

Автор: andriano 9.12.2009 23:50

Цитата(Гость @ 9.12.2009 12:35) *

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

Не на тайлы, а на фрагменты.
Простейший случай - разрезать по границам клеток.

Автор: Гость 10.12.2009 1:37

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

Автор: Гость 10.12.2009 1:38

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

Автор: andriano 10.12.2009 15:11

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

Автор: kosyak 10.12.2009 22:44

Хорошо, постараюсь заново задать вопрос конкретно.

Имеется поле 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 10.12.2009 23:04

1. Можно, если определить, что считать глубиной.
2. Можно, если определить, что такое "ближе" и "дальше" для протяженных объектов. В общем случае это можно сделать только в случае, когда ближайшая точка одного объекта находится дальше дельней точки другого. Во всех остальной существуют варианты.

Автор: kosyak 10.12.2009 23:05

Поставлю вопрос подругому. Можно ли отсортировать эти объекты по дальности? чтобы получился список объектов по порядку появления их на экране.

Автор: andriano 10.12.2009 23:18

Можно уточнить: отсортировать по дальности или отсортировать по прядку отрисовки?

Автор: kosyak 10.12.2009 23:53

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

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

Разве не одно и тоже: сортировка по дальности и порядок отрисовки?? если нет, то чем они отличаются?

Автор: andriano 11.12.2009 1:10

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

Добавлено через 3 мин.

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

Автор: kosyak 11.12.2009 1:44

Значит оптимальным решением здесь будет разбивка на тайлы?? или точнее на полоски любой высоты, а шириной в один тайл?? Правильно я понимаю?

И если можно привести пример такого расположения трех объектов, где будет ошибка отрисовки??

Автор: andriano 11.12.2009 2:09

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


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

Автор: kosyak 11.12.2009 2:14

Поняятно.... вот наверно так и буду делать. Это все нужно для создания игры типа ресторатора во Flash на ActionScript 3.0

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

0 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0

Автор: andriano 15.12.2009 13:44

Цитата(kosyak @ 10.12.2009 22:14) *
И интересно как ты построишь треугольник из трех прямоугольных объектов, которые распологаются либо вертикально либо горизонтально... не может быть такого:
Да, думаю, ограничение на геометрию, при котором все объекты располагаются на одной плоскости и не могут нависать друг над другом, исключает невозможность вычисления правильного порядка отрисовки.
Но это не общий случай, а именно случай ограничений на геометрию и взаимное расположение объектов.

Автор: kosyak 24.12.2009 1:13

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

Автор: TarasBer 24.12.2009 3:47

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

Автор: kosyak 24.12.2009 4:58

Нет... это изометрия 2,5D... т.е. как бы квадрат повернут на 45 градусов. Получается ромб

Автор: andriano 24.12.2009 16:14

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

Автор: kosyak 24.12.2009 16:48

http://animbook.mirmap.com/im/08/chapter08_html_57845982.jpg

вот такая изометрия. На рисунке показана одна плитка (квадрат 1*1).

Автор: andriano 24.12.2009 17:10

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

Автор: kosyak 24.12.2009 19:20

Потомучто игра пишется на флеше (ActionScript 3.0) и очень сложно делать анимацию зданий если их разрезать на тайлы.