crossplatform.ru

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

> 3D пример движения над сценой
ltise
  опции профиля:
сообщение 22.2.2013, 18:17
Сообщение #1


Студент
*

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

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




Репутация:   0  


Привет!

подскажите плиз, может у кого гденить завалялся пример реализации движения камеры над сценой ?

неделю уже собираю примеры из разных источников - получается какая-то фигня полная :)
в примерах Qt реализации движения камеры к сожалению нету....

Мне надо сделать-то в одном месте программы визуализацию профиля по grayscale пиксмапу в качестве карты глубин... и забыть :)

Заранее спасибо

Сообщение отредактировал ltise - 22.2.2013, 22:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 27.2.2013, 9:03
Сообщение #2


Старейший участник
****

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

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




Репутация:   8  


Ох с чего же начать :lol:
1.
Раскрывающийся текст

void GLWidget::saveGLState()
{
  glPushAttrib(GL_ALL_ATTRIB_BITS);
  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
}

void GLWidget::restoreGLState()
{
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();
  glPopAttrib();
}


Push и Pop должны идти в разном порядке (см. как работает стек (последний пришел-первый ушел)

2. Сохранение состояния не нужны (по крайней мере сейчас)
3. Всю настройку источников света можно вынести в initializeGL
4. Чуть покрутил коэффициенты, убрал мусор
Раскрывающийся текст
void GLWidget::initializeGL()
{
    makeCurrent ();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable (GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);    

    glShadeModel(GL_SMOOTH);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);

    // Enable light and set up 2 light sources (GL_LIGHT0 and GL_LIGHT1)
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    
    float ambientLight0[] = { 0.25f, 0.25f, 0.25f, 0.6f };
    float diffuseLight0[] = { 0.2f, 0.2f, 0.2f, 0.1f };
    float specularLight0[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    float position0[] = { 0, 0, -40.0f, 1.0f };

    // Assign created components to GL_LIGHT0
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0);
    glLightfv(GL_LIGHT0, GL_POSITION, position0);

      //
  //light model properties
  //
  float model_ambient[] = {0.4f, 0.4f, 0.4f, 1.0f};

  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);     //small white ambient light


  //
  // meterial properties
  //
  float no_mat[] = {0.0f, 0.0f, 0.0f, 1.0f};
  float mat_ambient[] = {0.7f, 0.7f, 0.7f, 0.1f};
  float mat_diffuse[] = {0.1f, 0.5f, 0.8f, 0.1f};
  float mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
  float high_shininess = 0.1f;

  glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  glMaterialf(GL_FRONT, GL_SHININESS, high_shininess);
  glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
}

5. Что самое главное для освещения? Правильно, нормали :lol:
Примерно так, неидеально конечно:
Раскрывающийся текст
void GLWidget::paintGL()
{  
  makeCurrent();

  glClearColor(.0, 0.0, .0, 1);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColor4f (1.0, 1.0, 1.0, 1.0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1, 1, -1, 1, 10, 100);
  glTranslatef(0.0f, 0.0f, -15.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glViewport(0, 0, width(), height());
  

  const int w = logo.width();
  const int h = logo.height();
  
  glRotatef(rot_x, 1.0f, 0.0f, 0.0f);
  glRotatef(rot_y, 0.0f, 1.0f, 0.0f);
  glRotatef(rot_z, 0.0f, 0.0f, 1.0f);
  glScalef(scale/w, scale/w, scale/w);

  glTranslatef(-w+1, 0, 0.0f);

  for(int j=0; j < h-1; ++j)
  {

    glBegin(GL_TRIANGLE_STRIP);
    for(int i=0; i < w-1; ++i)
    {
      double x = i;
      double y = j;
      GLfloat v1[] = {0,0,0};
      GLfloat v2[] = {0,0,0};
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
        v1[0] -= xx;
        v1[1] -= yy;
        v1[2] -= zz;
      }

      x = i+1;
      y = j;
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
        v1[0] += xx;
        v1[1] += yy;
        v1[2] += zz;
        v2[0] -= xx;
        v2[1] -= yy;
        v2[2] -= zz;
      }

      x = i;
      y = j+1;
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
        v2[0] += xx;
        v2[1] += yy;
        v2[2] += zz;
      }
      GLfloat normal[] = {v1[1]*v2[2] - v2[2]*v1[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1]- v1[1]*v2[0]};
      glNormal3fv (normal);
      x = i+1;
      y = j+1;
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
      }
    }
    glEnd();

  }  
  //restoreGLState();
}

6. Что почитать?
http://math.hws.edu/graphicsnotes/c4/s3.html (секция 4.3.4 очень рекомендуется)
http://www.glprogramming.com/red/chapter05.html
http://devernay.free.fr/cours/opengl/materials.html например.
7. Можно еще покрутить коэффициенты, но чтобы была реалистичная сталь, придется делать отражение (cube map например). Ну или текстуру.

Сообщение отредактировал lanz - 27.2.2013, 9:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 25.4.2024, 14:13