Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2014, 13:38   #1
saggy
Форумчанин
 
Регистрация: 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.
saggy вне форума Ответить с цитированием
Старый 02.05.2014, 15:01   #2
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Как на счет того, чтобы использовать функцию gluLookAt()? Очень удобное перемещение камеры.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.05.2014, 15:52   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

С push/pop всё просто: push сохраняет, pop восстанавливает. Получается:
Код:
glPushMatrix();
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);
...
glPopMatrix();
Со светом же пока непонятно что... Текущая матрица точно GL_MODELVIEW?
Somebody вне форума Ответить с цитированием
Старый 02.05.2014, 20:14   #4
saggy
Форумчанин
 
Регистрация: 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.
saggy вне форума Ответить с цитированием
Старый 02.05.2014, 20:31   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
с gluLookAt возникли небольшие проблемы в плане вращения камеры...
Полагаю, что у Вас не получается нормально вращать камеру с помощью мыши. Если так, то поможем.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.05.2014, 20:56   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если тут ничего не пропущено, то получается, что на момент вызова gluPerspective текущая матрица - GL_MODELVIEW, а надо GL_PROJECTION.
Somebody вне форума Ответить с цитированием
Старый 02.05.2014, 21:11   #7
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию

Последняя описанная мною проблема была при условии, что свет находился в координатах 50,50,50. я поставил его поближе, на 25,25,25, и проблема резкой смены освещения исчезла. =\
Цитата:
Полагаю, что у Вас не получается нормально вращать камеру с помощью мыши. Если так, то поможем.
Нет, вращаю не мышкой, просто нужен поворот камеры по X и по Z. а с gluLookAt камера у меня поворачивается только по X. если точку reference перенести левее или правее наблюдателя по оси Х, то камера начинает наклоняться по Y, чего совсем не нужно. Но разбираться с этой проблемой не обязательно, как я теперь понял, при "близком" свете одинаково работают как gluLookAt так и glTranslate

ЗЫ: при одном источнике света да, работает нормально. но при добавлении второго свет снова начинает менять своё положение (не плавно двигаться, а моментально) с разных точек обзора на модель
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.
saggy вне форума Ответить с цитированием
Старый 02.05.2014, 21:19   #8
saggy
Форумчанин
 
Регистрация: 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.
saggy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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