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