Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зеркало в OpenGl, задача построить параболическое зеркало 
:(
    Опции темы
mastiff
Дата 9.5.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.5.2010

Репутация: нет
Всего: нет



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


Код


void CGenekUGDlg::DrawMirror(double x)
{  
  double f_z=0.9-1*x*x;//функция параболы
  double f_z_next=0.9-1*(x+STEP)*(x+STEP);//функция параболы в след точке  

  glEnable(GL_STENCIL_TEST);
  /* условие всегда выполнено и значение в буфере будет равно 1*/
  glStencilFunc(GL_ALWAYS, 1, 0);
  glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);


  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  
  //прозрачность
  /*glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);*/
  glColor3d(0, 1, 0);  
  GLfloat temp1[3]={ x   ,-0.8, f_z};
  GLfloat temp2[3]={ x   , 0.8, f_z};
  GLfloat temp3[3]={ x+STEP, 0.8, f_z_next};
  GLfloat temp4[3]={ x+STEP,-0.8, f_z_next};

  for (int j=0;j<3;j++)
  {
    mas1[j]=temp1[j];
    mas2[j]=temp2[j];
    mas3[j]=temp3[j];
    mas4[j]=temp4[j];
  }

  glBegin(GL_QUADS);
  glVertex3fv( mas1);
  glVertex3fv( mas2);
  glVertex3fv( mas3);
  glVertex3fv( mas4);
  glEnd();

  get_normal_and_point();//получаем нормаль и точку на плоскости.
  GLfloat reflection_matrix[4][4];
  reflectionmatrix(reflection_matrix);//получаем матрицу поврота
  /* условие выполнено и тест дает истину только если значение в буфере маски равно 1 */
  glStencilFunc (GL_EQUAL, 0x1, 0xffffffff);
  /* ничего не меняем в буфере */
  glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  glPushMatrix();
  glMultMatrixf((float *)reflection_matrix);
  Draw_T();//рисуем сам объект.
  glPopMatrix();
  glDisable(GL_STENCIL_TEST);  
  
}

void CGenekUGDlg::get_normal_and_point()
{

    double A,B,C,sq_pw;
    A=mas1[1]*(mas2[2]-mas3[2])+mas2[1]*(mas3[2]-mas1[2])+mas3[1]*(mas1[2]-mas2[2]);
    B=mas1[2]*(mas2[0]-mas3[0])+mas2[2]*(mas3[0]-mas1[0])+mas3[2]*(mas1[0]-mas2[0]);
    C=mas1[0]*(mas2[1]-mas3[1])+mas2[0]*(mas3[1]-mas1[1])+mas3[0]*(mas1[1]-mas2[1]);
    sq_pw=sqrt(A*A+B*B+C*C);

    /*//реально центры граней зеркала- проверил в дебаге,но строится @#@$.
    plane_point[0]= mas1[0]+STEP/2.;
    plane_point[1]= 0;
    plane_point[2]=mas1[2]-(mas1[2]-mas4[2])/2.;*/

    plane_normal[0]=A/sq_pw;
    plane_normal[1]=B/sq_pw;
    plane_normal[2]=C/sq_pw;

    plane_point[0]= mas1[0];
    plane_point[1]= mas1[1];
    plane_point[2]= mas1[2];
}


Добавлено через 3 минуты и 46 секунд
обавлено: про построение зеркал прочитал вот в этой статье: 
http://www.rsdn.ru/article/opengl/ogltut2.xml#EYUBG

функцию которая генерит матрицу поворота взял оттуда же.

Это сообщение отредактировал(а) mastiff - 9.5.2010, 14:48
PM MAIL   Вверх
Karabas
Дата 27.2.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.6.2006

Репутация: нет
Всего: нет



Давно не заходил на форум, но сейчас увидел эту тему. Она уж скоро годовой давности.. 
С зеркалами никогда в opengl дела не имел, но сама идея меня заинтересовала. 
Вы решили эту проблему? Вы еще ей занимаетесь? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.