![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
tolyadzyuba |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
Выручайте! Я сделал прогу, которая рисует проволочную модель выпуклого многограника. Но теперь мне надо удалить невидимые грани, используя алгоритм Z буфера. По этой теме перечитал несколько статей, и как я понял в этом алгоритме необходимо проходить по всем пикселям экрана. И я не понимаю, как по ним пройтись всем, если у меня тока ребра многограника. Короче, кто знает про Z буфер, объясните, плиз, как мне отсканировать грани многограника, если у меня только координаты вершин извесны.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А нафига это было писать статьёй?
Для проволочной модели z буфер не поможет - через проволоки все прекрасно видно ![]() Для удаления невидимых граней нужно рендерить именно грани (а не ребра). Каждая грань отображается на плоскость вывода (точнее окно). z буфер покрывает эту плоскость. При рендеринге грани образуется массив (2х мерный) точек, соотвествующий образу исходной грани. Каждая точка так же содержит исходную z координату, которая и сравнивается с тем, что лежит в этом месте в z буфере |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Поскольку рисуются только рёбра, можно пройтись по всем граням и по всем рёбрам и определить какие рёбра закрываются гранями и определить множество рёбер не закрытых гранями и потом рисовать оставшиеся рёбра. Грань может закрывать часть ребра, но для выпуклого многогранника в итоге либо ребро видно целиком, либо не видно вовсе. С отдельными пискелями ничего делать не надо.
|
|||
|
||||
tolyadzyuba |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
Ну тогда объясните мне, дураку, как из координат вершин сделать грани, чтобы потом их просканировать???
|
|||
|
||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Многоранник должен быть представлен как множество вершин, множество рёбер и множество граней.
Если есть только вершины, можно восстановить рёбра и грани, но из-за ошибок огругления восстановленные грани будут треугольными и появятся дополнительные рёбра. Ребро определяется двумя вершинами. Ребро имеет формулу:
Грань - минимум по трём вершинам, плоскость грани имеет формулу
Для точек внутри многогранника и для вершин не приндлежащих грани знаки коэффициентов выбираются так, что
|
||||||
|
|||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Вектор (a,b,c) перпендикулярен плоскости грани и направлен внутрь многогранника.
Если мы проектируем на плоскость (x,y), то грани у которых c >= 0 не видны. Соответственно, нужно рисовать только рёбра видимых граней. |
|||
|
||||
tolyadzyuba |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
Это я знаю, это для выпуклых тока. Делал так. Мне надо z-буфер теперь сделать.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
C z-буфером - как писал xvr. Не определяешь какие грани видны, а какие нет, а рисуешь все попиксельно. Для каждого пискеля вычисляешь координату z согласно формуле a*x+b*y+c*z+d = 0. Если новая z больше старой, рисуешь соответствуюший пискель и устанавливаешь новый z, иначе пропускаешь
|
|||
|
||||
tolyadzyuba |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
Ага, спасибо огромное, на выходных буду пробовать вставить это все в программу. А то щас пока других проблем в учебе хватает!))
|
|||
|
||||
tolyadzyuba |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
Ну, помогайте опять! Посмотрите пожалуйста код мой, не могу найти, почему отображаются не правильно фигуры... Ребра не там, где надо....
Управление загрузкой фигур клавишами. Загрузка из файла, дам в конце текст файла kyb.txt. Чтобы его загрузить надо нажать Л.
kyb.txt:
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |