LINUX.ORG.RU

Найти разность множеств


0

1

Некая прелюдия. Занялся тут volume ray casting'ом, написал простые и более-менее шустрые демки для рендеринга ландшафтов по карте высот с билинейной фильтрацией, статическим освешением и прочей фигнёй.

Руководствовался этим:

http://www.flipcode.com/archives/Realtime_Voxel_Landscape_Engines-Part_2_Rend...

Вся эта фигня у меня тут (миры 512x512):

http://shamazvoxels.blogspot.com/

Решил таки заняться рендерингом полностью 3d мира. Вот пример, где рисуются конусы (мир 32x32x32) http://pastebin.com/yvaqqW9p

Технология там та же самая, но есть отличия:

В мире с ландшафтом я отрисовываю сцену «передом назад» (начиная с точки, близкой к камере, и заканчивая дальней), при этом задние объекты, если они хоть частично перекрываются передними, рисую так же частично. Рисую я столбиком от низа экрана до некоей точки. В этом мне помогает массив по экранной координате x, элементами которого являются координаты y самых высоких уже нарисованных объектов.

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

http://img696.imageshack.us/img696/4358/ybuffer.gif

В случае полноценного 3d мира, я рисую не столбиками от начала экрана, а отрезками, что усложняет нахождение перекрытий. Хочу от тебя, умный ЛОРовец, узнать, как найти разность отрезка, который предстоит нарисовать, с множеством тех, которые уже нарисованы без особых затрат (так чтобы это было быстрее отрисовки back-to-front, как я делаю сейчас).

Вот поясняющая картинка того, как происходит отрисовка:

http://img822.imageshack.us/img822/5153/explanation.jpg

Статьи по несложному volume ray casting'у тоже приветствуются


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

anonymous
()
Ответ на: комментарий от anonymous

Тогда на пустые области слишком много времени будет тратиться. Разве что предугадывать эти области.

Вот эта вот техника хороша тем, что в любом случае цикл будет только по одной из координат экрана и длине луча, а у тебя и по длине луча (хоть она и переменная) и по обоим координатам

Zorn
() автор топика
Ответ на: комментарий от anonymous

Вообще попробую так сделать, если лучше не придумаю. Фигово я тему назвал, однако

Zorn
() автор топика
Ответ на: комментарий от Zorn

только по одной из координат экрана

хм... этот как это?
разве кто-то действительно предложит способ продавливания одного массива через маску другого без фулл-скана :)

ну, можно еще заоптимайзить твой способ, например, разбив область результирующего двумерного массива на более мелкие области; тогда для таких подобластей можно хранить флаг полной ее прорисованности, и на таких областях обработку всех дальних слоев просто пропускать

anonymous
()
Ответ на: комментарий от anonymous

хм... этот как это?

Находишь проекцию луча на карту высот (при рендеринге ландшафта), либо на уровень, который ты считаешь нулевым и восстанавливаешь координату y по формуле

y = horiz + k(h-z)/(d+1)

d - длина, пройденная по лучу

У меня есть безумная идея использовать R-деревья

Zorn
() автор топика
Ответ на: комментарий от anonymous

Если интересно, я в этом блогспотовском бложике всё описал

Zorn
() автор топика
Ответ на: комментарий от Zorn

восстанавливаешь координату y

...какой точки?
и зачем?
и как это помогает избежать обхода по y?

короче, мне кажется, ты изобретаешь какие-то ненужные велосипеды :)

anonymous
()
Ответ на: комментарий от anonymous

короче, мне кажется, ты изобретаешь какие-то ненужные велосипеды :)

В ландшафте только так и делают. Инфа 100%

Короче, пускаешь луч (для каждой экранной координаты sx свой) из глаза под неким углом к карте высот. Берешь точку a на луче и проецируешь на карту высот,получаешь a'. Высота в a' - h. Высота точки на луче z, а прошли по лучу расстояние d.

По первой ссылке метод описан

и как это помогает избежать обхода по y?

Очевидно же. Недостаток у метода - порой сложно все 5 степеней свободы реализовать, какие используют обычно в играх

Zorn
() автор топика
Ответ на: комментарий от Zorn

В ландшафте только так и делают

ты же сам говоришь, что с ландшафтом проблем нет, а вопрос возникает с рисованием 3d в общем виде
чего же ты все время на него отвлекаешься?
да, при рисовании несложных поверхностей можно было юзать такой алгоритм, потому что дальняя из любых двух точек на сечении поверхности вертикальной плоскостью неизменно находилась выше
но легко придумать поверхность, где это не так, например, морда лох-несси в профиль на фоне высокой волны

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

anonymous
()
Ответ на: комментарий от anonymous

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

Нифига. Если плоскость рисовать, это конечно так. Этот способ с флипкода учитывает и высоту и дальность.

- просто неадекватно

Хз. Но вряд ли способ сильно изменится. Попробовать что ли ещё раз исходники voxlap посмотреть. Хотя я смотрел как-то - нет комментов + горы ассемблера

Zorn
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.