| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Как вычислить нормаль к вертексу? |
| Автор: =Женек= 15.12.2020, 15:58 | ||
| Друзья, есть вопрос. Есть библиотека 3d, простенькая. В ней есть функция - грузишь модель, представлющую собой массив, состоящий из вершин, индексов граней, нормалей и цвета, она эту модель отрисовывает. Массив я создал - забил в него вертексы, назначил их граням, в режиме Wireframe рисует отлично. Хочу теперь запустить имеющуюся функцию отрисовки в режиме Flat и Gouraud. Для этого в массив к каждому вертексу нужно добавить нормали. Именно к вертексу, а не к грани. ДЛя вычисления нормали к грани там есть своя функция, но для этого в нее нужно ввести нормали вертексов.
А как вычислить нормали к вертексам? Подвопрос: задает ли вершина нормаль? Или для ее расчета необходимы данные о всех трех ребрах, образующих грань? P.S. Попытался в Blender создать куб, сохранить и посмотреть в сохраненный файл, но в него записались уже вычисленные нормали граней, а по вертексам данных нет. [size="1"][color="grey"]Добавлено через 58 секунд[/color][/size] Вот эта библиотека, если что https://github.com/FabioRM/dsp3D/blob/master/src/dsp3D.c |
| Автор: Alexeis 15.12.2020, 16:09 |
| =Женек=, в простейшем случае нормаль к вершине, это среднее арифметическое нормалей ко всем полигонам, которые содержат эту вершину. Такие нормали используют для сглаживания при расчете освещения. Но если нужно нарисовать резкую границу, то обычно вершину добавляют в 2 разных набора полигонов и соответственно в каждом из них она будет иметь свое значение нормали. Т.е. она дважды попадет в список вершин. |
| Автор: Alexeis 20.12.2020, 14:52 |
| =Женек=, ну блин, нормаль к полигону это школьная программа. Векторное произведение 2х векторов дает вектор перпендикулярный плоскости этих 2х векторов. Берем любые 3 точки полигона, вычисляем вектора, вычитая из конца начало, перемножаем вектора, получаем вектор нормали, нормализуем его разделив координаты на длину вектора, которая вычисляется по теореме Пифагора. |
| Автор: =Женек= 27.12.2020, 13:33 | ||
| Я может что-то не так делаю Вот координаты 8 вершин куба и его нормали
Черный экран. Скажите, если нормаль неверна, то будет неправильное освещение? Или вообще не будет визуализации? Неужели я во всех 8 нормалях ошибся? |
| Автор: Alexeis 3.1.2021, 15:43 |
| =Женек=, причин может быть много черноты. Лучше начать с рабочего примера, чтобы было с чем сравнить. Для куба я повторял вершины (вместо того чтобы задавать их индексами), потому как его грани перпендикулярны, вряд ли следует назначать одинаковые нормали для двух взаимно перпендикулярных граней. Т.е. получается что грани взаимно перпендикулярны, а освещаться должны одинаково. |
| Автор: =Женек= 6.1.2021, 21:13 | ||
Нету его! И до автора библиотеки не достучаться |
| Автор: =Женек= 10.1.2021, 15:11 | ||
| Вы были правы - причина черноты в другом. Я поковырялся в коде и нашел вот что
Я в комментариях в коде написал что к чему. Так вот, если я убираю эту проверку, то получаю вот такое видео https://cloud.mail.ru/public/DGUX/TZoRw7stw Не обращайте внимание на тормоза, это поправимо. Геометрия правильная, видно, что освещение не такое, и некоторые грани не освещены, потому что я нормали расставил наугад. Но объясните мне, для чего нужна функция dsp3D_LL_writeToDepthBuffer ? Она пуста, потому что я должен сам туда ввести низкоуровневый код. К примеру функция dsp3D_LL_drawPoint тоже пуста, в нее я ввел свою функцию SetPixel(x,y,color) А что нужно писать в dsp3D_LL_writeToDepthBuffer? |
| Автор: kurlyak 25.2.2021, 16:35 | ||
Если надо нормаль к вертексу могу дать псевдокод где три вершины треугольника v1, v2, v3.
А потом как писалось в ответе усреднить три нормали. |