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