Название: освещение в OpenGL Отправлено: taifun от Декабрь 21, 2009, 14:10 Здраствуйте!
Не как не могу получить вот такую картинку snapshot2.png, результат пока такой как показан на snapshot3.png Код: void VMMutomo::initializeGL() подскажите как сделать, сижу читаю http://www.progz.ru/forum/index.php?showtopic=40730 , пробую, но желаемого результата пока не получил ... Название: Re: освещение в OpenGL Отправлено: Igors от Декабрь 21, 2009, 15:29 Если используется GL_SMOOTH, то надо обеспечить/задать нормали к вертексам (напр. с помощью glNormal..). В Вашем тексте я этого не увидел
Название: Re: освещение в OpenGL Отправлено: taifun от Декабрь 21, 2009, 15:36 Если используется GL_SMOOTH, то надо обеспечить/задать нормали к вертексам (напр. с помощью glNormal..). В Вашем тексте я этого не увидел Да, недавно дошло до меня про нормали, но как я понимаю их нужно вычислять, нужно знать формулу ... надо делать. А можно ли обойтись без нормалей и еще хочу уточнить, вот Вы пишите: надо задать нормали к вертексам (напр. с помощью glNormal..), а как можно еще их вычислить? Название: Re: освещение в OpenGL Отправлено: Igors от Декабрь 21, 2009, 16:00 Да, недавно дошло до меня про нормали, но как я понимаю их нужно вычислять, нужно знать формулу ... надо делать. А можно ли обойтись без нормалей и еще хочу уточнить, вот Вы пишите: надо задать нормали к вертексам (напр. с помощью glNormal..), а как можно еще их вычислить? Хммм... ну вообще-то 3/4 работы по построению модели - это именно вычисление вертексных нормалей (в различных вариантах) и только 1/4 (часто меньше) - сама геометрия :)На практике используются 3 способа вычисления нормалей: 1) Аналитический. Напр. для сферы нормаль к вертексу = (vertex_position - center).normalize() 2) Градиентный (называется по-разному, но всегда применяется когда нужно пересчитать существующие нормали напр. при деформации исходной модели) 3) Через осреднение всех (или некоторых) нормалей к полигонам в которые данный вертекс входит. Это дает нормали худшего качества чем 1, зато метод универсальный. Не существует какого-то "легкого удобного" способа, ну разве что если это стандартная модель строится ф-цией библиотеки - но на этом далеко не уехать Название: Re: освещение в OpenGL Отправлено: taifun от Декабрь 21, 2009, 16:16 Тааак. я теперь буду разбираться с построением нормалей, полагаю что нужно строить те которые под пунктом 1? а есть какие-нибудь тонкости, на которые мне необходимо сразу же обратить внимание при изучении материала и еще, может в какую-то сторону дополнительно нужно "покопать"?
Название: Re: освещение в OpenGL Отправлено: Igors от Декабрь 21, 2009, 17:12 Тааак. я теперь буду разбираться с построением нормалей, полагаю что нужно строить те которые под пунктом 1? а есть какие-нибудь тонкости, на которые мне необходимо сразу же обратить внимание при изучении материала и еще, может в какую-то сторону дополнительно нужно "покопать"? Не увлекайтесь всякими "умными библиотеками" да как чего подключить и.т.п. - это все фуфло. Выучите 2 вещи: скалярное и векторное произведение. Твердо и капитально. Сделайте свой прикладной класс чтобы работать в векторах а не месить все время x, y, z. Для начала все. Вот пара задачек, если Вы сможете записать решения в 1 строку кода - Вы и нормали построите1) Треугольник задан 3-мя точками (p0, p1, p2). Найти его площадь 2) Есть точка P (хотя для решения она не нужна). В этой точке есть вектор нормали к поверхности N и есть направление на источник света L (от точки к источнику). Найти отраженный вектор света V (угол падения = углу отражения) Название: Re: освещение в OpenGL Отправлено: taifun от Январь 14, 2010, 09:43 1) Треугольник задан 3-мя точками (p0, p1, p2). Найти его площадь 2) Есть точка P (хотя для решения она не нужна). В этой точке есть вектор нормали к поверхности N и есть направление на источник света L (от точки к источнику). Найти отраженный вектор света V (угол падения = углу отражения) №1 Площадь треугольника будет равна 1/2 площади параллелограмма образованного векторами р0р1 и р0р2. То есть решением будет 1/2 модуля векторного произведения векторов р0р1 и р0р2. №2 А вот тут уже сложнее ... из скалярного произведения получается, что cos(L^N) = cos(V^N) => L / |L| = V / |V| или я не правильно рассуждаю? |