OpenGL GL_TRIANGLE_STRIP; привидно не получава Z координатата да повлияе на рисуването

Опитвам се да начертая линия, използвайки GL_TRIANGLE_STRIP, която ще навлезе по-дълбоко или по-плитко с z координатата, но z стойността, която предавам в glVertex3f(), изглежда не влияе на възприеманата ширина. В кода по-долу (модифициран пример от Ръководство за програмиране на OpenGL) линията трябва да започва по-близо до перспективата (по-голяма) и да се отдалечава (по-малка).

Бихте ли посочили грешката ми или тема, в която се говори за това?

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
}
void display(void)
{
    GLdouble gran = 5.0;
    GLdouble width = 7.0;
    GLdouble theta = 1.047197551;
    GLdouble halfPi = 3.1459/2;
    GLdouble refpx = 50.0;
    GLdouble refpy = 50.0;
    GLdouble startr = 1.0;
    GLdouble startg = 1.0;
    GLdouble startb = .5;

    glClear(GL_COLOR_BUFFER_BIT);

    //glLoadIdentity();
    //glScalef(2.0, -.5,1.0);
    //glRotatef(45.0, 0.0, 0.0, 1.0);

    glBegin(GL_TRIANGLE_STRIP);

        for(int i = 0; i < 40; i++)
        {
            glColor3f(startr / i, startg / (20 - (i%20)), startb);

            GLdouble x1 = refpx + width*cos(theta + halfPi);
            GLdouble x2 = refpx + width*cos(theta + halfPi*3);
            GLdouble y1 = refpy + width*sin(theta + halfPi);
            GLdouble y2 = refpy + width*sin(theta + halfPi*3);

            glVertex3f(x1,y1, (GLdouble)i/40.0);
            glVertex3f(x2,y2, (GLdouble)i/40.0);

            refpx += gran*cos(theta);
            refpy += gran*sin(theta);
            if(i % 9 == 0) {
                theta += halfPi/8;
            }
            if(i == 20) {
                theta -= halfPi/2;
            }
            if(i == 5) {
                theta -= halfPi/2;
            }
        }
    glEnd();
    glDisable(GL_BLEND);
    glFlush();
}
void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, (GLdouble) w, 0.0, (GLdouble) h, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(450, 450);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

person balthatrix    schedule 18.11.2013    source източник
comment
Опитвате ли се да симулирате перспектива или искате действителна перспектива? Ако искате действителна перспектива, ще трябва да използвате нещо като gluPerspective() вместо glOrtho().   -  person genpfault    schedule 19.11.2013
comment
Хей благодаря за отговора! Бих искал да симулирам перспектива, тъй като причината, поради която проучвам това, е да добавя функционалност към програма, чиито процедури за рисуване вече са настроени по този начин. Някакви предположения?   -  person balthatrix    schedule 19.11.2013


Отговори (1)


Вие настройвате проекционната матрица само на ортографичен изглед. Това означава, че промените в разстоянието от камерата няма да повлияят на размера на обекта на екрана.

В перспективна проекция нещата са много по-малки, което не е вярно за ортографска проекция.

Така че във вашите изчисления на върха Z координатата се контролира от i, но не и от X и Y, те се контролират само от тригонометрията и по-специално, докато refpx и refpy се променят, размерът на обекта в равнината XY никога не го прави ( защото единствената вариация е синус или косинус, добавен към стойностите refpx и refpy).

Ето защо: не може да варира, защото нямате нищо в математиката, което да изчислява координатите X и Y, което да променя размера според разстоянието. Само по себе си Z няма да има значение за размера на екрана, освен ако не зададете трансформация на перспектива в проекционната матрица. Използвайте gluPerspective за по-лесно или сглобете своя собствена матрица на камерата, математиката е тук: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection

person Ian    schedule 18.11.2013
comment
Благодаря за отговорите! Получих функционалността, от която се нуждаех, използвайки състоянието gluPerspective. Беше много по-лесно, отколкото си мислех, и направих някои доста спретнати класове за рисуване на линии, по-широки от десет пиксела, използвайки също GL_TRIANGLE_STRIP. Благодаря отново. - person balthatrix; 07.12.2013
comment
@balthatrix Ако отговорът ми е бил полезен, моля, гласувайте за и го приемете. - person Ian; 09.12.2013
comment
съжалявам, че отне толкова време, сър, наистина оценявам отговора и беше точно това, от което имах нужда. Все още не мога да гласувам за, тъй като все още нямам 15 представителя, ха-ха! - person balthatrix; 12.06.2014