Зеркало в Opengl

  • Автор темы mastiff
  • Дата начала
M

mastiff

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

C++:
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];
}
Добавлено: про построение зеркал прочитал вот в этой статье:
http://www.rsdn.ru/article/opengl/ogltut2.xml#EYUBG

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