Russian Qt Forum
Ноябрь 24, 2024, 21:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: освещение в OpenGL  (Прочитано 8048 раз)
taifun
Гость
« : Декабрь 21, 2009, 14:10 »

Здраствуйте!
Не как не могу получить вот такую картинку snapshot2.png, результат пока такой как показан на snapshot3.png

Код:
void VMMutomo::initializeGL()
{
    qglClearColor(trolltechPurple.dark());      //цвет фона
    object = makeObject();

    glShadeModel(GL_FLAT);
    glShadeModel(GL_SMOOTH);

    glEnable(GL_DEPTH_TEST);
    //glEnable(GL_CULL_FACE);

// ------ ------ ------ освещение ------ ------ ------

    GLfloat light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};     //фоновый свет
    GLfloat light_diffuse[] = { 0.0f, 0.9f, 0.9f, 1.0f};     //значение диффузного света
    GLfloat light_position[] = {0.0f, 0.0f, 150.0f, 1.0f };    //позиция источника света

    glLightfv (GL_LIGHT1, GL_AMBIENT, light_ambient);   //устанавливаем фоновый свет
    glLightfv (GL_LIGHT1, GL_DIFFUSE, light_diffuse);   //устанавливаем диффузный свет
    glLightfv (GL_LIGHT1, GL_POSITION, light_position); //устанавливаем позицию источника света

    //glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);                              // Разрешить освещение
    glEnable (GL_LIGHT1);


}

void VMMutomo::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
    glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
    glRotated(zRot / 16.0, 0.0, 0.0, 1.0);

    //glCallList(object);
 //******************* рисуем оси координат ******************
    glLineWidth(3);
    glBegin(GL_LINES);
        glColor3f(1.0, 0.0, 0.0);       //ось Х
        glVertex3d(0.0, 0.0, 0.0);
        glVertex3d(25, 0.0, 0.0);

        glColor3f(0.0, 1.0, 0.0);       //ось Y
        glVertex3d(0.0, 0.0, 0.0);
        glVertex3d(0.0, 25, 0.0);

        glColor3f(0.0, 0.0, 1.0);       //ось Z
        glVertex3d(0.0, 0.0, 0.0);
        glVertex3d(0.0, 0.0, 25);
    glEnd();
//************************************************************

    glLineWidth(1);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);



    const float center[3] = {0, 0, 0};            //центр
//*************************************

    qglColor(Qt::cyan);
    glRotated(90, 1.0, 0.0, 0.0);
    glTranslated(0.0, 0.0, -80.0);
    crtDetect (96);                     //строим трубки координатной плоскости-Х
    glTranslated(0.0, 0.0, 40.0);
    crtDetect (96);                     //строим трубки координатной плоскости-Х
    glTranslated(0.0, 0.0, 80.0);
    crtDetect (96);                     //строим трубки координатной плоскости-Х
    glTranslated(0.0, 0.0, 40.0);
    crtDetect (96);                     //строим трубки координатной плоскости-Х

//************************************************************
}

void VMMutomo::resizeGL(int width, int height)
{
    minSideView = qMin(width, height);
    glViewport((width - minSideView) / 2, (height - minSideView) / 2, minSideView, minSideView  );

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-150.0, +150.0, +150.0, -150.0, -150.0, 150.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

подскажите как сделать, сижу читаю http://www.progz.ru/forum/index.php?showtopic=40730 , пробую,  но желаемого результата пока не получил ...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 21, 2009, 15:29 »

Если используется GL_SMOOTH, то надо обеспечить/задать нормали к вертексам (напр. с помощью glNormal..). В Вашем тексте я этого не увидел
Записан
taifun
Гость
« Ответ #2 : Декабрь 21, 2009, 15:36 »

Если используется GL_SMOOTH, то надо обеспечить/задать нормали к вертексам (напр. с помощью glNormal..). В Вашем тексте я этого не увидел

Да, недавно дошло до меня про нормали, но как я понимаю их нужно вычислять, нужно знать формулу ... надо делать. А можно ли обойтись без нормалей и еще хочу уточнить, вот Вы пишите: надо задать нормали к вертексам (напр. с помощью glNormal..), а как можно еще их вычислить?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 21, 2009, 16:00 »

Да, недавно дошло до меня про нормали, но как я понимаю их нужно вычислять, нужно знать формулу ... надо делать. А можно ли обойтись без нормалей и еще хочу уточнить, вот Вы пишите: надо задать нормали к вертексам (напр. с помощью glNormal..), а как можно еще их вычислить?
Хммм... ну вообще-то 3/4 работы по построению модели - это именно вычисление вертексных нормалей (в различных вариантах) и только 1/4 (часто меньше) - сама геометрия  Улыбающийся
На практике используются 3 способа вычисления нормалей:

1) Аналитический. Напр. для сферы нормаль к вертексу = (vertex_position - center).normalize()

2) Градиентный (называется по-разному, но всегда применяется когда нужно пересчитать существующие нормали напр. при деформации исходной модели)

3) Через осреднение всех (или некоторых) нормалей к полигонам в которые данный вертекс входит. Это дает нормали худшего качества чем 1, зато метод универсальный.

Не существует какого-то "легкого удобного" способа, ну разве что если это стандартная модель строится ф-цией библиотеки - но на этом далеко не уехать
Записан
taifun
Гость
« Ответ #4 : Декабрь 21, 2009, 16:16 »

Тааак. я теперь буду разбираться с построением нормалей, полагаю что нужно строить те которые под пунктом 1? а есть какие-нибудь тонкости, на которые мне необходимо сразу же обратить внимание при изучении материала и еще, может в какую-то сторону дополнительно нужно "покопать"?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 21, 2009, 17:12 »

Тааак. я теперь буду разбираться с построением нормалей, полагаю что нужно строить те которые под пунктом 1? а есть какие-нибудь тонкости, на которые мне необходимо сразу же обратить внимание при изучении материала и еще, может в какую-то сторону дополнительно нужно "покопать"?
Не увлекайтесь всякими "умными библиотеками" да как чего подключить и.т.п. - это все фуфло. Выучите 2 вещи: скалярное и векторное произведение. Твердо и капитально. Сделайте свой прикладной класс чтобы работать в векторах а не месить все время x, y, z. Для начала все. Вот пара задачек, если Вы сможете записать решения в 1 строку кода - Вы и нормали построите

1) Треугольник задан 3-мя точками (p0, p1, p2). Найти его площадь

2) Есть точка P (хотя для решения она не нужна). В этой точке есть вектор нормали к поверхности N и есть направление на источник света  L (от точки к источнику). Найти отраженный вектор света V (угол падения = углу отражения)
Записан
taifun
Гость
« Ответ #6 : Январь 14, 2010, 09:43 »

1) Треугольник задан 3-мя точками (p0, p1, p2). Найти его площадь

2) Есть точка P (хотя для решения она не нужна). В этой точке есть вектор нормали к поверхности N и есть направление на источник света  L (от точки к источнику). Найти отраженный вектор света V (угол падения = углу отражения)

№1
          Площадь треугольника будет равна 1/2 площади параллелограмма образованного векторами р0р1 и р0р2. То есть решением будет 1/2 модуля векторного произведения векторов р0р1 и р0р2.

№2
          А вот тут уже сложнее ... из скалярного произведения получается, что cos(L^N) = cos(V^N) => L / |L| = V / |V| или я не правильно рассуждаю?
« Последнее редактирование: Январь 14, 2010, 10:18 от taifun » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 22.