| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Вектора нормали в OpenGL |
| Автор: nght_elf 6.4.2008, 21:50 | ||
| Народ помогите пожалуйста дописать програмку. Её суть- просто построить некоторуя фигуру, которую я построил, но не смог разобраться с освещением.. Вот её код, да, к стати, что-то мне подсказывает, что реализация задачи выполнена через заднее место.. Если вы увидете способ, как такую фигуру построить подругому- напишите плиз..
фигура- часть цилиндра, построенного из множества(400 шт) прямоугольников.. я находил вектора номали по стандартному способу- но лажа в том, что прямоугольники в данном примере практически сводятся к отрезку, т.к. их ширина стремится к нулю.. К сожалению число 700 здесь необходимо, и предложения уменьшить число плоскостей не подходит, к поставленной мне задачи.. |
| Автор: DragonFire 7.4.2008, 10:59 | ||||
| Когда-то давно, классе в 10 писал прожку... Там надо было загрузить из 3Дмакса объект с нормальным освещением. Я стоил нормали к каждой вершине по алгоритму: Перебираются все вершины фигуры, для каждой из них: 1) Перебираются все грани (плоскости), содержащие вершину 2) Находится нормаль к этой плоскости (по 3 точкам) 3) Все вектора нормалей суммируются 4) Происходит нормировка полученного вектора 5) Все данные передаются в OpenGL У меня есть код, но там все повязано на объектак и векторах, но мб поможет, вот процедура нормировки:
Добавлено через 1 минуту и 47 секунд Это вдогонку:
|
| Автор: nght_elf 8.4.2008, 20:10 |
| Поясни алгоритм поподробнее пожалуйста. |
| Автор: Alexeis 8.4.2008, 21:00 |
| nght_elf, векторное произведение 2х векторов дает вектор нормали, но его нужно нормировать на единицу, т.е. разделить каждую из координат на длину вектора нормали. В зависимость от того как задавать порядок вершин по часовой или против получается либо внутренняя нормаль либо наружная. |
| Автор: DragonFire 8.4.2008, 22:20 |
| Alexeis, Именно) линал азы... А алгоритм... Строим нормали к каждой вершине. Сначало большой цикл по всем вершинам. Вначале вектор нормали к вершине - нулевой. 1) Перебираются все грани (плоскости), содержащие вершину Тут цикл, который проходит по всем граням. Если текущая вершина принадлежит грани, то мы прибавляем к уже полученному вектору нормали вершины (на самом первом шаге - к нулевому вектору), нормаль к плоскости. 2) Находится нормаль к этой плоскости (по 3 точкам) Тут берутся 3 вершины любые принадлежащие грани, по ним строится нормаль ( как это сделать где-то на форуме было, ищи по "нормаль к плоскости по трем точкам"). 3) Происходит нормировка полученного вектора Тут цикл по вершинам заканчивается. И ПОлученные вектора нормалей все делятся на свои длины. 4) Все данные передаются в OpenGL Тут вроде все ясно - перед каждой glVertex вызываем glNormal |