2013-11-18 1 views
1

Я пытаюсь нарисовать строку, используя GL_TRIANGLE_STRIP, которая будет углубляться или быть более мелкой с координатой z, но значение z, которое я передаю в glVertex3f(), не кажется, влияют на воспринимаемую ширину. В приведенном ниже коде (модифицированный пример из Руководства по программированию OpenGL) линия должна начинаться ближе к перспективе (более крупная) и проходить дальше (меньше).OpenGL GL_TRIANGLE_STRIP; похоже, не приводит к тому, что координата Z влияет на чертеж

Вы бы указали на мою ошибку или тему, в которой это адресовано?

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; 
} 
+0

Вы пытаетесь * имитировать * перспективу или хотите * актуальную * перспективу? Если вы хотите * актуальную * перспективу, вам нужно будет использовать нечто вроде 'gluPerspective()' вместо 'glOrtho()'. – genpfault

+0

Эй, спасибо за ответ! Я хотел бы моделировать перспективу, так как причина, по которой Im исследует это, - добавить функциональность к программе, чьи схемы обработки уже настроены таким образом. Какие-либо предложения? – balthatrix

ответ

1

Вы устанавливаете матрицу проекций только на орфографический вид. Это означает, что изменения на расстоянии от камеры не будут влиять на размер объекта на экране.

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

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

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

+1

Спасибо за ответы! Я получил необходимую функциональность, используя состояние gluPerspective. Это было намного проще, чем я думал, и я сделал несколько довольно аккуратных классов для рисования линий шириной более десяти пикселей, используя GL_TRIANGLE_STRIP. Еще раз спасибо. – balthatrix

+1

@balthatrix Если бы мой ответ был полезен, пожалуйста, поддержите его и примите. – Ian

+0

жаль, что так долго сэр, я очень ценю ответ, и это было именно то, что мне было нужно. Не могу подняться, хотя, поскольку у меня нет 15 репутации, все же ха-ха! – balthatrix