Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
2 / 2 / 1
Регистрация: 18.03.2018
Сообщений: 145

Как сделать освещение?

18.01.2021, 16:24. Показов 4895. Ответов 20

Студворк — интернет-сервис помощи студентам
Доброго времени суток, господа.
У меня есть такое задание:
Включить 3 источника света, задать отражающие свойства поверхностей,
положение и цвет источников света. Рекомендуется цвет поверхностей
сделать одинаковым, а отражающие свойства – разными.
Вывести несколько объемных объектов. Источники света должны иметь
различный цвет.
Но вот никак не могу разобраться со светом, я его задаю, вроде бы, а ничего не меняется, в чём моя ошибка, подскажите?

C++
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <glut.h>
 
GLfloat  rx = 0;            // Угол поворта сцены вокруг оси X
GLfloat  ry = 0;            // Угол поворта сцены вокруг оси Y
 
int mx, my;             // Координаты мыши
bool ldown = false;     // Нажата левая клавиша мыши?
bool rdown = false;     // Нажата правая клавиша мыши?
 
GLfloat vertices[] =        // массив вершин 
{
    0.5f, 0.5f, 0.5f,               // Верх право квадрата (верх)
    -0.5f, 0.5f, 0.5f,              // Верх лево
    -0.5f, 0.5f, -0.5f,             // Низ лево
    0.5f, 0.5f, -0.5f,              // Низ право
 
    0.5f, -0.5f, -0.5f,             // Верх право квадрата (низ)
    -0.5f, -0.5f, -0.5f,            // Верх лево
    -0.5f, -0.5f, 0.5f,             // Низ лево
    0.5f, -0.5f, 0.5f,              // Низ право
 
    0.5, 0.5, -0.5,                 // Право верх квадрата (Перед)
    -0.5, 0.5, -0.5,                // Лево верх
    -0.5, -0.5, -0.5,               // Лево низ
    0.5, -0.5, -0.5,                // Право низ
 
    -0.5f, 0.5f, 0.5f,              // Верх право квадрата (Зад)
    0.5f, 0.5f, 0.5f,               // Верх лево
    0.5f, -0.5f, 0.5f,              // Низ лево
    -0.5f, -0.5f, 0.5f,             // Низ право
 
    -0.5f, 0.5f, -0.5f,             // Верх право квадрата (слева)
    -0.5f, 0.5f, 0.5f,              // Верх лево
    -0.5f, -0.5f, 0.5f,             // Низ лево
    -0.5f, -0.5f, -0.5f,            // Низ право
 
    0.5f, 0.5f, 0.5f,               // Верх право квадрата (право)
    0.5f, 0.5f, -0.5f,              // Верх лево
    0.5f, -0.5f, -0.5f,             // Низ лево
    0.5f, -0.5f, 0.5f,              // Низ право
};
 
GLfloat ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light0_diffuse[] = { 1.0f, 1.0f, 1.0f ,1.0f };
GLfloat light0_lpos[]     = { 0.0f,0.0f, 1.0f ,1.0f };
GLfloat light1_diffuse[] = { 0.0f, 1.0f, 1.0f ,1.0f };
GLfloat light1_lpos[] = { 0.0f, 1.0f, 0.0f ,1.0f };
GLfloat light2_diffuse[] = { 0.0f, 1.0f, 0.0f ,1.0f };
GLfloat light2_lpos[] = { -1.0f, -1.0f, 0.0f ,1.0f };
 
void lightInit() 
{
    static GLfloat LightAmb[] = { 1.0, 1.0, 1.0, 1.0 }; //Окружающий свет
    static GLfloat LightDif[] = { 0.01, 0.01, 0.01, 1.0 }; //Рассеянный свет
    //Позиция источника освещения
 
    static GLfloat LightPos[] = { 0.0f,0.0f, 1.0f ,1.0f };
    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmb);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDif);
    glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
    glEnable(GL_LIGHT0);
 
    static GLfloat LightDif2[] = { 0.01, 0.01, 0.0, 1.0 };
    static GLfloat LightPos2[] = { 0.0f, 1.0f, 0.0f ,1.0f };
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDif2);
    glLightfv(GL_LIGHT1, GL_POSITION, LightPos2);
    glEnable(GL_LIGHT1);
 
    static GLfloat LightDif3[] = { 0.01, 0.0, 0.0, 1.0 };
    static GLfloat LightPos3[] = { -1.0f, -1.0f, 0.0f ,1.0f };
    glLightfv(GL_LIGHT2, GL_DIFFUSE, LightDif3);
    glLightfv(GL_LIGHT2, GL_POSITION, LightPos3);
    glEnable(GL_LIGHT2);
}
 
void Display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);                                    //включение теста глубины
 
    /*//диффузный свет 
    glEnable(GL_NORMALIZE);  // нормализация вектора вершин 
 
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_lpos);
 
    glEnable(GL_LIGHT1);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
    glLightfv(GL_LIGHT1, GL_POSITION, light1_lpos);
 
    glEnable(GL_LIGHT2);
    glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);
    glLightfv(GL_LIGHT2, GL_POSITION, light2_lpos);*/
 
    lightInit();
 
    glEnableClientState(GL_VERTEX_ARRAY);                       // Включаем режим вершинных массивов.
    glColor4f(1.0f, 0.5f, 0.0f, 1.0f);
    
    glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), vertices);
    glDrawArrays(GL_QUADS, 0, 24);
 
    glRotatef(rx, 1, 0, 0);
    glRotatef(ry, 0, 1, 0);
    
    
 
    glutSwapBuffers();                                          // меняем буферы т.к GLUT_DOUBLE
    glFlush();
}
 
void mouseButton(int button, int state, int x, int y)
{
    if (button == GLUT_LEFT_BUTTON)     //Левая кнопка
    {
        switch (state)
        {
        case GLUT_DOWN:                 //Если нажата
            ldown = true;               //установить флаг
            mx = x;                     //Запомнить координаты
            my = y;
            break;
        case GLUT_UP:                   // Если отжата
            ldown = false;              // установить флаг
            break;
        }
    }
}
 
void mouseMove(int x, int y)
{
    if (ldown)      // Левая кнопка нажата
    {
        rx += 0.001 * (y - my); //Изменение угола поворота
        ry += 0.001 * (x - mx);
        mx = x;
        my = y;
        glutPostRedisplay();    //Перерисовать экран
    }
}
 
 
void Reshape(int w, int h)
{
    if (h == 0)                                                 // предотвращение деления на 0   
    {
        h = 1;
    }
 
    glViewport(0, 0, w, h);                                         // задаём область вывода изображения
    glMatrixMode(GL_PROJECTION);                                    // устанавливаем матрицу проекций
    glLoadIdentity();                                               // делаем её единичной
    glOrtho(20.0, 20.0, 20.0, 20.0, 50.0, -50.0);                   // установка двумерной ортографической сисемы координат
    glMatrixMode(GL_MODELVIEW);                                     // режим видовой матрицы
    glLoadIdentity();                                               // делаем её единичной
}
 
 
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);                               // включаем двойную буферизацию 
    glutInitWindowSize(800, 600);                                               // задаём размер окна
    glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH) - 800) / 2, (glutGet(GLUT_SCREEN_HEIGHT) - 600) / 2);// начальные координаты окна 
                                                                                                    //(отсчитываются с левого верхнего угла)
    glutCreateWindow("OpenGL lesson 1");                                        // называем окно 
 
    
 
    glutReshapeFunc(Reshape);                                                   // вызов функции масштабирования 
    glutDisplayFunc(Display);                                                   // вызов функции рисования
 
    glutMouseFunc(mouseButton);
    glutMotionFunc(mouseMove);
 
 
    glutMainLoop();                                                             // запуск всего инициализированного (аналогия main)
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2021, 16:24
Ответы с готовыми решениями:

Луна (сделать освещение сферы)
помогите в VS 2010 (c++) сделать освещение сферы: // нарисуем луну glPushMatrix(); glColor3f(255.0f,255.0f,0.0f); ...

Как сделать данное освещение обьекта?
Помогите пожалуйста как сделать освещение обьекта сзади? Верней меня интересует как такое вообще можно сделать с нуля Если можно...

Какое освещение сделать, чтобы зрение не портилось?
Всем привет! Скажите пожалуйста какое освещение сделать, чтобы в небольшой комнате было очень светло как днём и зрение не портилось. Просто...

20
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
19.01.2021, 20:43
Студворк — интернет-сервис помощи студентам
Вот немного масла в огонь =).
Чтобы летать камерой по неподвижной сцене нужно делать алгоритм с таймером. Что-то такое иначе будут лаги:
Если было нажатие на клавиатуре то проверить если было нажатие на выбранные кнопки то установить флаг bool было нажатие кнопки N. Прибавить к переменной шаг угла поворота и повернуть камеру. Отрендерить сцену и после рендера установить флаг bool рендер завершен. По событию таймера если рендер завершен переключить буфер.
И крутить нужно не там а вот тут т.к позиция света задана в массиве.
C++
1
2
3
4
5
   gluLookAt(
        x, y, z,
        0.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 1.0f
    );
Почитать кто это
https://www.khronos.org/regist... LookAt.xml
вот этот вектор
C++
1
2
3
GLdouble eyeX
GLdouble eyeY,
GLdouble eyeZ,


можно получить из параметрического уравнения сферы.
“Параметрическое уравнение сферы с центром в точке ”
https://ru.wikipedia.org/wiki/Сфера
Эти заданы центр сферы
C++
1
2
3
GLdouble centerX,
GLdouble centerY,
GLdouble centerZ
А вот эти
C++
1
2
3
GLdouble upX,
GLdouble upY,
GLdouble upZ
Проблема посложней, тут нужно будет делать векторное произведение, пару раз хотя вроде там пашет просто задать 0.0.1 если углы облета небольшие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2021, 20:43
Помогаю со студенческими работами здесь

Как можно отключать освещение во время игры через скрипт?
Приветствую. Каким образом, можно отключать освещение во время игры через скрипт? На фото ниже, я стрелкой указал, что именно я хочу...

Свет в углу комнаты сбивается при изменении размеров окна
создаю комнату ,и хочу добавить в угол свет.при создании окна все нормально но как только изменяю размер окна все сбивается и источник...

Освещение (C#)
В общем, пишу проект, загрузил в него свою модель, но мне нужно поменять положение и интенсивность источника освещения. В интернете не...

Освещение
glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0,...

Three.js, освещение
Подскажите пожалуйста что не так делаю со светом. &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;title&gt;Tree.js&lt;/title&gt; ...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru