crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> openGL свет
instant
  опции профиля:
сообщение 7.11.2011, 8:19
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.11.2011
Пользователь №: 2984

Спасибо сказали: 0 раз(а)




Репутация:   0  


День добрый.
Программа рисует несколько кубиков и позволяет крутить их вокруг оси. Так же имеется источник света.
Проблема следующая:
При развороте кубика у него продолжает подсвечиваться та же сторона что и была светлой, а не та которая непосредственно сейчас находится вблизи света.
 void GLWidget::paintGL()
{
     int i;
     qglClearColor(clearColor);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glLoadIdentity();
     glTranslated(0, -15, -60.0);
     i=0;

     while(i<count)
     {i++;
         glTranslated( 0,4, 0.0f);
              glRotatef(y[i],0.0f,1.0f,0.0f);
                    kub[i]=cube(-2,-2,-2,4,4,4);
                    glCallList(kub[i]);
              glRotatef(y[i],0.0f,-1.0f,0.0f);
     }

     glRotatef(angleX,1.0f,0.0f,0.0f);
     glRotatef(angleY,0.0f,1.0f,0.0f);
     GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 0.5f };
     GLfloat LightPosition[]= { 0, 0, -20, 1.0f };
     kub[1]=cube(1,1,-21,2,2,2);
     glCallList(kub[1]);
     GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
     glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
     glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
     glEnable(GL_LIGHT1);
     glEnable(GL_LIGHTING);


}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 7.11.2011, 8:31
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


по-моему, у тебя просто все glCallList вызываются ДО задания источников освещения. и весь цикл прорисовки разрывается после поворота кубиков, но до перерисовки света. попробуй перенести установку света в начало прорисовки. хотя я могу ошибаться, я слишком давно не работала с OpenGL.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
instant
  опции профиля:
сообщение 7.11.2011, 8:42
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.11.2011
Пользователь №: 2984

Спасибо сказали: 0 раз(а)




Репутация:   0  


изменил . проверил. никаких изменений :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 7.11.2011, 9:55
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(instant @ 7.11.2011, 9:19) *
Проблема следующая:
При развороте кубика у него продолжает подсвечиваться та же сторона что и была светлой, а не та которая непосредственно сейчас находится вблизи света.


В коде заданы трансформации для всей сцены (вместе с источником освещения). Чтобы источник не перемещался достаточно вызвать

 glLoadIdentity();


перед установкой света.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
instant
  опции профиля:
сообщение 7.11.2011, 12:51
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.11.2011
Пользователь №: 2984

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ssoft @ 7.11.2011, 9:55) *
Цитата(instant @ 7.11.2011, 9:19) *
Проблема следующая:
При развороте кубика у него продолжает подсвечиваться та же сторона что и была светлой, а не та которая непосредственно сейчас находится вблизи света.


В коде заданы трансформации для всей сцены (вместе с источником освещения). Чтобы источник не перемещался достаточно вызвать

 glLoadIdentity();


перед установкой света.

гмм. мне как раз и нужно чтобы источник двигался. он двигается нормальною также он двигается после отрисовки всех объектов(до после не важно . результат тот же). но когда я разворачиваю один из объектов на сцене он поворачивается той стороной что была в тени и она не становиться светлее хотя теперь находится на свету.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 7.11.2011, 22:46
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Судя по коду ты двигаешь/вращаешь всю сцену вместе с источником света. Ты просто меняешь матрицу наблюдения для всей сцены, Поэтому освещение объектов не меняется. Попробуй использовать стеки матриц. В одном стеке вращай КоллЛист, а в другом источник -- света.

Это попробуй задать в инициализации, а не в рисовании
     glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
     glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
     glEnable(GL_LIGHT1);
     glEnable(GL_LIGHTING);


Странный код, впервый раз вижу, чтобы так вызывался дисплейный список
     kub[1]=cube(1,1,-21,2,2,2);
     glCallList(kub[1]);


Цитата
Странный код, впервый раз вижу, чтобы так вызывался дисплейный список
Хотя может и ... . Сделай простую проверку со стеками матриц, например, куб нарисуй между засунуть и вытолкнуть из стека, а источник света нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
instant
  опции профиля:
сообщение 8.11.2011, 9:59
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.11.2011
Пользователь №: 2984

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Ты просто меняешь матрицу наблюдения для всей сцены, Поэтому освещение объектов не меняется.

поворот же происходит после прорисовки сцены? и на этот угол и происходит отклонение источника света. с эти все ок.
Цитата
Это попробуй задать в инициализации, а не в рисовании
     glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
     glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
     glEnable(GL_LIGHT1);
     glEnable(GL_LIGHTING);

пробовал . проблема не исчезла.
Возможно я конечно путаю но glRotatef поворачивает не всю сцену а только то что рисуется после него.
Выходит что я поворачиваю только источник света. а на камеру это никак не влияет.

думаю с картинками станет понятнее проблема.
источник света немного сзади от объектов и подсвечивает слабо справа.

источник света перед объектами, все освещено:

поворачиваем объект сцены, источник света как видно на изображении остается на месте, но повернутый объект затемнен(точнее он освещен с той стороны где у него написана "6"):


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 8.11.2011, 14:24
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Я с освещением подробно не работал. Спроси здесь http://www.gamedev.ru/code/forum/?graphics, там много спецов по подобным вопросам :)

Сообщение отредактировал registr - 8.11.2011, 14:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.2.2025, 6:58