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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Свет и тени в OpenGL  (Прочитано 4956 раз)
ru
Гость
« : Январь 14, 2008, 18:28 »

есть объект, его освещает один направленный источник.

вроде все рисуется нормально, но так как объект (у меня прорисовывается спутник)
не попадает полностью на экран - то мы его уменьшаем :
Код:
   glScaled(0.5,0.5,0.5);

при повторной прорисовке объект  уменьшается дальше и дальше.
в чем фигня - почему то чем меньше спутник - тем светлее он становится и очень быстро  перестает быть 3-х мерным, а становится 2-мерным белым пятном.
вот код проги:

Код:
void init(void)
{
   GLfloat mat_specular[]={0.1,0.1,0.1,1.0};
   GLfloat mat_shininess[]={50.0};
   GLfloat light_position[]={1.0,1.0,1.0,0.0};
   GLfloat white_light[]={0.5,0.5,0.5,0.5};
//   GLfloat white_light1[]={0.0,0.0,0.0,.1};
   GLfloat lmodel_ambient[]={0.5,0.0,0.0,1.0};
   GLfloat mat_amb_diff[]={0.9,0.9,0.9,1.0};

//   glClearColor(0.0,0.0,0.0,0.0);
   glShadeModel(GL_SMOOTH);
 //  glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
 //  glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
   glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff);
   glLightfv(GL_LIGHT0,GL_POSITION,light_position);
   glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
   glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);
   glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);

 //  glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION, 0.0);
 //  glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION, 5.0);
 //  glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION, 2.0);

   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_DEPTH_TEST);
}
Код:
void display(void)
{
   OBJModel* satellite_model_ = 0;
   if ( satellite_model_ == 0 ) {
    satellite_model_ = new OBJModel;
       
    std::ifstream ifs( "satellite.obj" );
std::string str;
ifs >> str;
    satellite_model_->load_model( ifs );
    ifs.close();
  }
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

   glScaled(0.5,0.5,0.5);
   satellite_model_->render();
//   glutSolidSphere(1.0,40,16);
   glFlush();
}
спутник задается файлом satellite.obj

Код:
void reshape(int w, int h)
{
   glViewport(0,0,(GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (w<=h)
      glOrtho(-1.5,1.5,-0.5*(GLfloat)h/(GLfloat)w,0.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
   else
      glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

скажите, где я дурак?

позицию источника пытался изменить до умопомрачения,
делал его позицыонным и с разными коэф. ослабления интенсивности света...
но осветление все равно происходит
Записан
Sergeich
Гость
« Ответ #1 : Январь 14, 2008, 21:15 »

Попробуй

glPushMatrix();
glScaled(0.5,0.5,0.5);
satellite_model_->render();
glPopMatrix();

И причем здесь qt?
Записан
ru
Гость
« Ответ #2 : Январь 15, 2008, 15:00 »

сорри, QT не при чем)

ошибся разделом)
Записан
ru
Гость
« Ответ #3 : Январь 16, 2008, 17:19 »

Цитировать
Попробуй

glPushMatrix();
glScaled(0.5,0.5,0.5);
satellite_model_->render();
glPopMatrix();

жаль саму проблему это не снимает... только сохраняет проэкцию
если уменьшим изображение -

glScaled(0.1,0.1,0.1);
то оно стем же успехом осветляется превращаясь в двумерную фигню
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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