Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102

Источник света поворачивается вместе с камерой

17.12.2020, 16:47. Показов 4263. Ответов 35

Студворк — интернет-сервис помощи студентам
Делаю 3д сцену где можно передвигаться, добавил источник света, но он поворачивается вслед за камерой, как сделать чтобы он находился в одной точке относительно сцены.

glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#version 330 core
 
uniform vec3 lightPos;
 
uniform vec3 ambientColor, diffuseColor, objectColor;
 
in vec3 fragNormal;
 
in vec3 fragPos;
 
out vec4 fragColor;
uniform vec4 color;
 
void main(void)
{
 
    fragColor = color; // Цвет по умолчанию
 
    // Направление источника
     vec3 lightDir = normalize(lightPos - fragPos);
 
     // Сила света по модели Ламберта
     float power = max(dot(fragNormal, lightDir), 0.0);
 
     vec3 diffuse = power * diffuseColor;
 
     vec3 result = (ambientColor + diffuse) * objectColor;
 
     fragColor = vec4(result, 1.0f);
}
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#version 330 core
 
// Вершина
in vec4 vertex;
 
// Вектор нормали к вершине
in vec3 normal;
 
// Результирующая матрица
uniform mat4 matrix;
 
// Матрица для умножения векторов нормалей
uniform mat3 normalMatrix;
 
// Видовая матрица для нахождения мировых координат вершин при расчёте освещения
uniform mat4 modelViewMatrix;
 
// Вектор нормали и позиция фрагмента, которые будут переданы по конвейеру далее
out vec3 fragNormal;
out vec3 fragPos;
 
void main(void)
{
 
   gl_Position = matrix * vertex;
 
   // Для расчёта освещения необходимо знать координаты вершин в пространстве видовых преобразований,
   // поэтому нужно умножать только видовую матрицу (не выполнять проектирование) на исходные координаты вершин
   fragPos = vec4(modelViewMatrix * vertex).xyz;
 
   // Рассчитаем вектор нормали для фрагментного шейдера
   fragNormal = normalize(normalMatrix * normal);
}
Добавлено через 17 минут
Удаление вызовов NormalMatrix и ModelViewMatrix решило проблему. Но теперь источник светит куда то в сторону.

Добавлено через 23 секунды
И еще вопрос как вернуть цвет объектам освещенным теперь, просто они стали одноцветные?

Добавлено через 14 минут
Как можно повернуть источник света на 90 градусов?

Добавлено через 2 часа 6 минут
и также вопрос надо будет прописывать нормали для каждого объекта на сцене?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2020, 16:47
Ответы с готовыми решениями:

Перемещение источника света вместе с камерой
Здравствуйте. Может кто-то сталкивался со связкой источника света и камеры в проекте на C# ? Задача в том, чтобы при вращении...

точечный источник света и его изображения полученные путем однократного отражения света от двух плоских зеркал образуют треугольник с углом 90 градусо
Помогите решить задачу!!! точечный источник света и его изображения полученные путем однократного отражения света от двух плоских зеркал...

OpenGl QT Не работает поворот, поворачивается рывками или вообще не поворачивается
.h #ifndef WIDGET_H #define WIDGET_H #include <QtOpenGL> #include <QGLWidget> namespace Ui { class Widget;

35
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
17.12.2020, 20:24  [ТС]
Студворк — интернет-сервис помощи студентам
zayats80888, ну вот у меня как раз DifuseColor почему то светит в одну сторону, могу прикрепить пикчу, либо я неправильно понял пример где его использовали либо да.

Добавлено через 39 секунд
zayats80888, с glEnable(GL_Lighting) все было понятнее
0
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
17.12.2020, 20:26  [ТС]
и вот я пытаюсь с этим разобраться целый день, почему точечный светит не как точечный а как прожекторный
Миниатюры
Источник света поворачивается вместе с камерой  
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.12.2020, 20:29
Цитата Сообщение от labudaba Посмотреть сообщение
ну вот у меня как раз DifuseColor почему то светит в одну сторону
Может с нормалями накосячил?
Цитата Сообщение от labudaba Посмотреть сообщение
могу прикрепить пикчу
Крепи.
Для ознакомления: https://habr.com/ru/post/337642/

Добавлено через 1 минуту
Цитата Сообщение от labudaba Посмотреть сообщение
fragNormal = normalize(normalMatrix * normal);
Это убери, оно для матрицы модели, а не для матрицы камеры.
0
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
17.12.2020, 20:29  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Может с нормалями накосячил?
такое вполне возможно,
Цитата Сообщение от zayats80888 Посмотреть сообщение
Для ознакомления: https://habr.com/ru/post/337642/
данный урок читал.
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.12.2020, 20:30
labudaba,
Code
1
fragNormal = normalize(vec3(modelViewMatrix* vec4(normal, 0.0)));
0
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
17.12.2020, 20:36  [ТС]
zayats80888, тот же результат

Добавлено через 2 минуты
zayats80888,
Думаю вот тут ошибка, но пока еще не понял в чем
C++ (Qt)
1
     vec3 lightDir = normalize( lightPos - fragPos );
Добавлено через 48 секунд
zayats80888, Просто если оставить просто fragPos, то он начинает выглядеть как точечный
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.12.2020, 20:37
Цитата Сообщение от labudaba Посмотреть сообщение
тот же результат
Значит нормали кривые, мне проверять лень.
Цитата Сообщение от labudaba Посмотреть сообщение
Думаю вот тут ошибка
Нет, тут у тебя всё правильно.
0
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
17.12.2020, 20:40  [ТС]
zayats80888, Хорошо, вам и не надо, сам проверю, кстати заметил, что теперь при перемещении самой камеры вдоль осей, источник света тоже перемещается

Добавлено через 54 секунды
Цитата Сообщение от labudaba Посмотреть сообщение
кстати заметил, что теперь при перемещении самой камеры вдоль осей, источник света тоже перемещается
это при варианте когда,
Цитата Сообщение от zayats80888 Посмотреть сообщение
fragNormal = normalize(vec3(modelViewMatrix* vec4(normal, 0.0)));
Добавлено через 55 секунд
там все таки надо было умножать матрицу нормали, ладно я на седня все, даже не знаю как вас уже благодарить, вы мне очень сильно помогли!!!
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.12.2020, 20:48
Цитата Сообщение от labudaba Посмотреть сообщение
это при варианте когда
Да, верни обратно, правильно будет normalize(transpose(mat3(inverse(modelViewMatrix))) * normal)
1
Модератор
Эксперт Java
 Аватар для alecss131
2897 / 1403 / 412
Регистрация: 11.08.2017
Сообщений: 4,498
Записей в блоге: 2
17.12.2020, 21:10
zayats80888, зачем такие затратные действия если можно просто?
glSlang
1
normalize(vec3(modelViewMatrix * vec4(normal, 0.0f)))
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.12.2020, 21:13
Цитата Сообщение от alecss131 Посмотреть сообщение
зачем такие затратные действия если можно просто?
Пост № 25.
Формально нельзя.
0
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
18.12.2020, 13:29  [ТС]
Что-то пробовал поправлять нормали, источник света все равно не точечный, а какой-то прожекторный

Добавлено через 19 минут
zayats80888, вы не знаете в чем еще может быть проблема, как я не менял нормаль источник светит одинаково. По сути нормаль влияет только на то как падает на объект свет
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.12.2020, 14:42
Цитата Сообщение от labudaba Посмотреть сообщение
вы не знаете в чем еще может быть проблема
У вас массив вершин содержит 8 вершин, а массив нормалей - 24.
Т.е. индексы у вас обращаются только к первым 8 нормалям в массиве нормалей, остальные игнорируются.
Вам нужен массив из 24 вершин и индексы соответственно исправить.
1
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
18.12.2020, 14:47  [ТС]
zayats80888, Да вы правы.

Добавлено через 2 минуты
zayats80888, отрисовку мне производить через drawArrays получается, я просто чтобы избежать повторения вершин использовал drawElements?
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.12.2020, 14:53
Цитата Сообщение от labudaba Посмотреть сообщение
отрисовку мне производить через drawArrays получается
Да, лучше так, индексы в данном случае избыточны.
1
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
18.12.2020, 14:57  [ТС]
zayats80888, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2020, 14:57

Источник света
Источник монохроматического света мощностью 88 Вт за промежуток времени 3 секунды испускает 1020 фотонов, вызывающих фотоэффект на...

Источник света
не знаю как добавить еще пару источников света, получилось сделать только один.. #include "stdafx.h" #include...

Объекты и источник света
День добрый господа. подскажите пожалуйста, как то можно сделать так, чтобы объекты не реагировали на свет, то есть не меняли оттенок...

Источник света в С++ Builder
Как сделать источник света для какой - либо геометрической фигуры, допустим сферы! Направление(с лева или права) не имеет значение

Мнимый источник света
Просьба пояснить такой момент. имеем такую оптическую систему, как на картинке, луч из источника s1 падает на рассеивающую линзу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru