Зеркало в Opengl

Тема в разделе "MS Visual C++", создана пользователем mastiff, 9 май 2010.

  1. mastiff

    mastiff Гость

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

    Код (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

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

Поделиться этой страницей