Закраска по методу Гуро и Фонга |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Закраска по методу Гуро и Фонга |
18192123 |
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Мне нужно изобразить тетраэдр , выполнить закраску Фонга относительно выбранного источника света, разработать процедуру управления скоростью вращения тела с одинаковыми ускорениями по осям и обеспечения перехода на низкозатратную процедуру Гуро и далее на закраску с использованием таблиц освещенности при увеличении угловых скоростей вращения.
Вот... Не знаю даже, с чего начать... Теорию по методам закраски изучила.... но с таким никогда не сталкивалась, поэтому с реализацией большие проблемы.... вот на что думаю опираться: 1. Получить нормаль грани: выбрать два вектора, лежащие в этой грани и найти их векторное произведение, нормировать этот вектор. 2. Записать найденные нормали граней в массив (normg[i]). Чтобы определить нормаль каждой вершины, определяем из таблицы граней для каждой вершины, какие грани в ней сходятся, и для этих найденных граней их нормали суммируем, а сумму нор-мируем (массив normv[i]). 3. Алгоритм Гуро. После того, как нормали вершин найдены, вы-числяем согласно модели освещения освещенность каждой вершины и записываем освещенности в массив освещенностей. Этот массив будет использоваться в процедуре рисования грани. Алгоритм Фонга. Координаты найденных нормалей вершин пе-реводятся в сферические координаты, так что нормали представле-ны двумя числами типа byte. Нормали в таком виде будут использо-ваны процедурой рисования грани. 4. Реализовать процедуру рисования грани, для чего необходимо провести интерполяцию для определения освещенности (в ме-тоде Гуро) и нормали (в методе Фонга) для каждой точки гра-ни. Закраску граней можно произвести путем заполнения внутренней области этой грани отрезками прямых, параллельных оси OX. Для этого найдем вершины грани с наименьшей и наибольшей координатой Y. В качестве начальной возьмем вершину с наименьшей координатой Y. Разобьем условно множество ребер, составляющих грань, на две группы – левую и правую. Будем по очереди брать одно ребро из левой и одно из правой части, т.е. всегда работать с парой ребер. Выбор ребер может производиться следующим образом: сначала берем в качестве левого ребра ребро, начинающееся в начальной вершине и заканчиваю-щееся в следующей по порядку при обходе влево. Это ребро (l0,lk). Аналогично, в качестве первого правого ребра – ребро (r0,rk). Теперь в цикле будем строить прямые, параллельные оси X, начиная с прямой Y = Ymin, каждый раз увеличивая ординату. Для каждой этой прямой бу-дем находить точки пересечения с нашей парой боковых ребер. Если одно из боковых ребер не имеет точки пересечения с этой прямой, то его отбрасываем и берем следующее из его группы (левой или правой). Если точки пересечения найдены, то найдем, какая часть левого и правого ребра пройдена, это значение запишется соответственно в пе-ременные tl и tr. Значение переменных tl и tr используется на первом шаге билинейной интерполяции в методе Гуро для нахождения осве-щенности в точках пересечения прямой, параллельной оси Х, и ребер, а в методе Фонга для определения нормалей тела в этих точках. Второй шаг интерполяции ведется аналогично, только вдоль отрезка, заключен-ного между парой ребер. Таким образом, вычисляется необходимая ин-формация для каждой точки грани. но как всё это реализовать - не знаю! С чего начинать! Может быть кто-нибудь может привести реализацию методов закраски? |
18192123 |
Сообщение
#2
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
получилось нарисовать фигуру и вращать её, вот только с соединениями линий - путаница.... где ошибка?
Сообщение отредактировано: 18192123 - |
18192123 |
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
а как выбрать источник света и как с ним работать?
|
volvo |
Сообщение
#4
|
Гость |
Марина, загляни вот сюда:
Dasaev Demo Guide v1.1 Там у него описывается работа с закрасками и по Гуро и по Фонгу... |
18192123 |
Сообщение
#5
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Марина, загляни вот сюда: Dasaev Demo Guide v1.1 Там у него описывается работа с закрасками и по Гуро и по Фонгу... зашла по ссылке, скачала архив, но там полная ерунда - нужные файлы, где должны быть исходники, содержат только набор разных символов! |
18192123 |
Сообщение
#6
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
а может есть ещё что-то такое?
|
18192123 |
Сообщение
#7
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Нашла вот такую программу для закраски тетраэдра:
мне здесь не понятно назначение функции minz, а также что хранится в этом массиве записей и для чего это нужно:
а самое главное - не понятна главная часть процедуры Рисование(procedure draw;), каким образом там производится рисование и закраска? пожалуйста, объясните основные моменты этого куска! |
18192123 |
Сообщение
#8
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Если тетраэдр с его вершинами и сторонами задаётся таким образом (см. код), то как выбрать два вектора, лежащие в какой-то грани и так для всех граней?
Сообщение отредактировано: 18192123 - |
18192123 |
Сообщение
#9
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
и что значит "нормировать" вектор? ( как это производится?)
|
Malice |
Сообщение
#10
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Вот еще с далеких фидошных времен откопался примерчик заливки по фонгу, думаю поможет:
PHONG.RAR ( 9.58 килобайт )
Кол-во скачиваний: 597
|
18192123 |
Сообщение
#11
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Вот еще с далеких фидошных времен откопался примерчик заливки по фонгу, думаю поможет: PHONG.RAR ( 9.58 килобайт ) Кол-во скачиваний: 597 Спасибо! Но лучше уж я с чистого листа начну.... Вопросы из сообщений 8 и 9 до сих пор для меня не ясны... |
18192123 |
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Спасибо! Но лучше уж я с чистого листа начну.... Вопросы из сообщений 8 и 9 до сих пор для меня не ясны... Почему никто не хочет мне этого объяснить на моём примере? Я хочу сделать сама, но мне нужно вначале понять, как начинать, а начинать нужно с взятия нормалей, нахождения их векторного произведения и нормирования полученного вектора.... Ну не пойму я, как выбрать в начале вектора! ( а в программе, которую оставил Malice для меня всё не понятно! Да и объёмчик внушительный!) |
Lapp |
Сообщение
#13
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
и что значит "нормировать" вектор? ( как это производится?) Я думаю, нормировать - это значит сделать так, чтобы его длина была равна 1, сохранив направление прежним. Добавлено через 2 мин. задаётся таким образом (см. код), Мне непонятен способ задания тетраедра. Это вершины? или что? Поясни, пожалуйста. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
Сообщение
#14
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Я думаю, нормировать - это значит сделать так, чтобы его длина была равна 1, сохранив направление прежним. никогда о таком не слышала...а можно показать на примере, как это сделать? Добавлено через 7 мин. Мне непонятен способ задания тетраедра. Это вершины? или что? Поясни, пожалуйста. х, у, z - это вершины g:array[1..n,1..4] - линии но мне кажется ,что лучше задавать эти величины так ,как я пыталась выше (не совсем удачно..)
у меня тут линий не хватает вроде... |
Lapp |
Сообщение
#15
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
никогда о таком не слышала...а можно показать на примере, как это сделать? Ai'=Ai/|A| Остальное позже. Машина в ремонте, автобус уходит.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
18192123 |
Сообщение
#16
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
|
Lapp |
Сообщение
#17
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
|A| - поясни пожалуйста, это модуль чего? (без i) Модуль вектора А. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Malice |
Сообщение
#18
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
мне здесь не понятно назначение функции minz поиск минимальной Z-координаты а также что хранится в этом массиве записей и для чего это нужно:
а самое главное - не понятна главная часть процедуры Рисование(procedure draw;), каким образом там производится рисование и закраска? пожалуйста, объясните основные моменты этого куска! pnts- массив всех вершин грани, используется для функции FillPoly, которая выполняет заливку. Цитата икогда о таком не слышала...а можно показать на примере, как это сделать? находишь длину вектора нормали и дельшь все его координаты на длину. Получается вектор длиной =1. Цитата у меня тут линий не хватает вроде... Как бы да У тебя всего 4 точки (0..3), а в описаниях граней присутствуют цифры 4 и 5 Вот так попробуй чтоли: array[0..11] of real = (1,0,0, 0,1,0, 0,0,1, -0.5,-0.5,-0.5); |
18192123 |
Сообщение
#19
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
кусок программы из 2-го поста что значат такие записи tetr[line_[p*2]*3])+260 tetr[line_[p*2]*3+1])+300 tetr[line_[p*2+1]*3])+260 tetr[line_[p*2+1]*3+1])+300 а именно, не пойму, для чего *2, *3, прибавляем 1 в разных местах??? |
Malice |
Сообщение
#20
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
а именно, не пойму, для чего *2, *3, прибавляем 1 в разных местах??? Что ж тут не понятного ? Массив Line_ заполнен так [что соединяем, с чем, что, с чем, ..] т.е. на четных местах стоих первая точка, на нечетных - вторая. По-этому p*2-четная точка, p*2+1 следующая, т.е. с которой соединение. Массив tetr так [x, y, z, x,y,z, и т.д.], принцип тот же.. |
Текстовая версия | 23.12.2024 21:18 |