|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.05.2014, 13:38 | #1 |
Форумчанин
Регистрация: 08.10.2009
Сообщений: 112
|
Проблема перемещения света вместе с камерой OpenGL
Суть заключается в том, что у меня есть 3D сцена с перемещающейся камерой. При добавлении в сцену света оказалось, что свет неподвластен перемещению с помощью функции glTranslatef() (а именно с помощью этой функции я перемещаю камеру). Поискав в интернете я нашёл несколько невнятных решений с использованием glMatrixModel, Push/PopMatrix (точно названия не помню). Я честно копировал строки в нужном порядке, но мне это не помогало. Свет как двигался вместе с камерой, так и двигается. Как можно решить эту проблему? Необходимо сделать так, чтобы свет всё время был в одном и том же месте сцены.
Приведу небольшой код на С++ MVS, если он вообще нужен: void Display() { ... glRotatef(camera.x_angle,1,0,0); glRotatef(camera.z_angle,0,0,1); glTranslatef(-camera.x,-camera.y,-camera.z); ... glLightfv(GL_LIGHT1, GL_POSITION, light_pos); ... glTranslatef(camera.x,camera.y,came ra.z); glRotatef(-camera.z_angle,0,0,1); glRotatef(-camera.x_angle,1,0,0); ... } Может, можно каким-то обазом просчитать координаты light_pos[4] относительно camera.x,camera.y, camera.z, camera.z_angle и camera.x_angle. Но максимум, что у меня получилось правильно просчитать - это только координаты камеры без учёта углов её поворота (а это необходимо в конечном итоге всё таки учесть): light_pos[0] = startpos.x - camera.x; light_pos[1] = startpos.y - camera.y; light_pos[2] = startpos.z - camera.z;
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
|
02.05.2014, 15:52 | #3 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
С push/pop всё просто: push сохраняет, pop восстанавливает. Получается:
Код:
|
02.05.2014, 20:14 | #4 |
Форумчанин
Регистрация: 08.10.2009
Сообщений: 112
|
с gluLookAt возникли небольшие проблемы в плане вращения камеры...но ладно, пусть будет.
похимичил с push/pop. никаких изменений. вобщем, свет, созданный нижеприведенным кодом, вроде не двигается, но. освещаемая модель на некотором отдалении наблюдателя резко начинает освещаться по другому - будто источник света перенесли в другое место. при возвращении наблюдателя в исходную позицию всё встаёт обратно на свои места. инициализация: glutInitDisplayMode (GLUT_SINGLE|GLUT_RGB); glutCreateWindow(""); glutFullScreen(); glViewport (0.0, 0.0, (GLfloat) wwidth, (GLfloat) wheight); glLoadIdentity (); gluPerspective (45.0, 1.0, 0.1, 1000); glClearDepth(1.0); glDepthFunc(GL_LEQUAL); glMatrixMode(GL_MODELVIEW); glClearColor(0.0, 0.15, 0.3, 0.0); /*регистрация функции отрисовки кадра*/ glutDisplayFunc(Display); /*регистрация функци-движка*/ glutIdleFunc(Engine); /*регистрация функций, принимающих данные с клавиатуры*/ glutKeyboardFunc(Recieve_Keyboard); glutKeyboardUpFunc(Key_Up); /*регистрация функций, принимающих данные с мышки*/ glutMouseFunc(M_Click); glutPassiveMotionFunc(M_Motion); camera.x = 0, camera.y = 0, camera.z = 0, camera.x_angle = -45, camera.z_angle = 0; LoadTextures(); glEnable(GL_LIGHTING); glEnable(GL_LIGHT2); GLfloat light1_diffuse[] = {0.7, 0.4, 0.2}; light_pos[0] = 5; light_pos[1] = 5; light_pos[2] = 5; light_pos[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE, light1_diffuse); glShadeModel(GL_SMOOTH); функция display: glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glClear (GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glScalef(SCREEN_SCALE_X,1,1); gluLookAt(camera.x,camera.y,camera. z,reference.x,reference.y,reference .z,0,1.0,0); glEnable(GL_LIGHT0); GLfloat light0_diffuse[] = {0.7, 0.7, 0.7}; glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); GLfloat buf3[4] = {-50,-50,50,1.0}; glLightfv(GL_LIGHT0, GL_POSITION, buf3); DrawModels(); glDisable(GL_LIGHT0); glClear (GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST); glPopMatrix(); glFlush(); ЗЫ: если проблема слишком сложна, то лучше подскажите как (или хотя бы где найти способ) можно перевести координаты x y z в новую систему координат вручную, аналогично glTranslate и glScale
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
Последний раз редактировалось saggy; 02.05.2014 в 20:37. |
02.05.2014, 20:31 | #5 | |
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
Цитата:
|
|
02.05.2014, 20:56 | #6 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
Если тут ничего не пропущено, то получается, что на момент вызова gluPerspective текущая матрица - GL_MODELVIEW, а надо GL_PROJECTION.
|
02.05.2014, 21:11 | #7 | |
Форумчанин
Регистрация: 08.10.2009
Сообщений: 112
|
Последняя описанная мною проблема была при условии, что свет находился в координатах 50,50,50. я поставил его поближе, на 25,25,25, и проблема резкой смены освещения исчезла. =\
Цитата:
ЗЫ: при одном источнике света да, работает нормально. но при добавлении второго свет снова начинает менять своё положение (не плавно двигаться, а моментально) с разных точек обзора на модель
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
Последний раз редактировалось saggy; 02.05.2014 в 21:16. |
|
02.05.2014, 21:19 | #8 |
Форумчанин
Регистрация: 08.10.2009
Сообщений: 112
|
Всем большое спасибо за отклик! Решил проблему добавлением glMatrixMode(GL_PROJECTION); перед gluPerspective (45.0, 1.0, 0.1, 1000);
Свет работает идеально, остаётся на месте, не дергается и не меняется, даже если он не один. Спасибо
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
OpenGl Как динамически создавать источники света | impulsgraw | Мультимедиа в Delphi | 6 | 11.08.2012 11:26 |
openGl направленный источник света | kaljan775 | Помощь студентам | 3 | 06.02.2012 04:48 |
Движение со скоростью света и быстрее скорости света - Сверхсветовое движение | Alar | Свободное общение | 354 | 13.11.2011 21:32 |
Фиксация источника света в OpenGL | Rin | Мультимедиа в Delphi | 5 | 29.03.2010 22:44 |
Загрузить библиотеку вместе сразу вместе с программой | Anekdot | Общие вопросы Delphi | 4 | 26.01.2010 23:14 |