Войти
ФлеймФорумПрограммирование

Программировании графики в Досе + Алгоритм Робертса (2 стр)

Страницы: 1 2 3 Следующая »
#15
1:57, 26 сен 2011

Вообщем смотри :)

Задаешь вершины, матрицы посчитал (projection/modelview), умножаешь вершину (x,y,z,w) на матрицу projection * modelview, перспективное деление, коррекция viewport, и ты получаешь координаты экрана. Z координату сразу отправляй в свой "Z-buffer", запись элементарная.

Теперь "растеризатор". Берешь алгоритм товарисча Брезенхема, вроде. У него есть достаточно быстрый алгоритм вывода линии. Далее гуглишь что то типа "алгоритмы заполнения контурных фигур", реализуешь и получаешь готовую графику, с возможностью изменения цвета примитива. Алгоритмы заполнения тоже есть достаточно быстрые, а сами линии заполнения рисуй теми самимы линиями по Брезенхему.

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

#16
2:19, 26 сен 2011

Drazd
> И может кто посоветует еще какой литературы немного полегче?

Ламота читал?

#17
8:12, 26 сен 2011

Была такая замечаттельная советская книжка "Синтез изображений. Базовые алгоритмы". Там как раз описывали все возможные варианты рисования каркасных фигур с удалением невидимых линий без всяких там з-буферов и прочей ерунды.  Просто, доступно, с минимально возможными исходниками. Вся книжка - страниц 150, не более.

Правда, примеры были на паскале, но смысл описанного там не менялся.  Так как цвета тогда не особо много было, в книжке отлично описывалось как делать заливку получившихся фигур всякими модными на то время штрихово-узорными заливками :)

#18
9:29, 26 сен 2011

Не нужны никакие Брезенхемы, 3D координаты матрицами приводятся в 2D с глубиной, в 2D треугольники рендерятся только горизонтальными линиями. Только ещё предварительно отсечь по фрустуму нужно, самое главное - NearPlane, иначе деление на 0 может быть, да и другие баги. Либо заранее постулировать, что в сцене не будет геометрии, на расстоянии <=0 от камеры по оси Z.
А ещё проще - принять, что будет изометрическая проекция и фиксированная позиция камеры, тогда не нужны ни матрицы, ни отсечение.

#19
11:28, 26 сен 2011

Z-буфер - очевидное читерство, для векторной графики есть другие алгоритмы удаления невидимых линий.
  1. Рисуем только треугольники с обходом углов против часовой стрелке (или только по, зависит от матриц)
  2. Для каждой линии берем каждый треугольник, который может ее закрывать, определяем перед ним она или за ни, выделяем точки пересечения с ним.
  3. Рисуем эти незакрытые отрезки.

#20
11:54, 26 сен 2011

kipar
Изобрази такое без Z-буфера:
Изображение удалено
И это ещё просто, представь, что треугольники взаимно проникают.

#21
12:29, 26 сен 2011

Mikle
И что?
Берем верхнюю линию желтого треугольника. Она пересекается с красным и зеленым.
Красный лежит ниже, так что его игнорируем. Зеленый лежит выше, поэтому убираем из линии отрезок между точками пересечения.
Тоже для второй линии желтого треугольника.
Тоже для линии красного треугольника...
В конце получается именно векторный рисунок, т.е. без раскраски областей, также как и на рисунке автора темы.
Для раскраски возможно, тоже можно что-то придумать, но с этим я уже не сталкивался.

#22
12:30, 26 сен 2011

Ах да. И вот алгоритм Робертса:
http://compgraph.tpu.ru/roberts.htm

#23
12:33, 26 сен 2011

kipar
А представь, что жёлтый треугольник пробивает зелёный насквозь.

#24
13:01, 26 сен 2011

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

#25
13:58, 26 сен 2011

kipar
> Этот алгоритм не работает с пересекающимися телами, но они не во всех задачах и
> нужны.
Так Drazd в нулевом посту написал:
> взял себе (хоть препод и отговаривала) тему с удалением невидимых поверхностей
> вращающихся и пересекающихся меж друг другом куба и параллелепипеда
То есть тут это нужно.

#26
14:19, 26 сен 2011

Mikle
> То есть тут это нужно.
Хорошо, тогда сначала перебираем попарно все пересекающиеся грани и добавляем в рассмотрение ребра, являющиеся их пересечением. А дальше работаем и с исходными и с этими новыми ребрами, определяя их видимость.

#27
17:08, 26 сен 2011

kipar
> Хорошо, тогда сначала перебираем попарно все пересекающиеся грани и добавляем в
> рассмотрение ребра, являющиеся их пересечением. А дальше работаем и с исходными
> и с этими новыми ребрами, определяя их видимость.
А вообще все эти переборы и прочее, решаются в лоб, создавая Z-buffer в памяти.

#28
17:13, 26 сен 2011

Мух
Теперь, когда у компов достаточно памяти и производительности, да - можно не использовать векторную графику, а решать в лоб через z-буфер.

Но автору темы надо было сделать по алгоритму Робертса.

#29
20:14, 26 сен 2011

все так увлеклись, что сапоги забыли запостить :)

Страницы: 1 2 3 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.