Показать glutSolidCone на его стороне - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь посмотреть на конус, лежащий на боку сверху. Для этого я написал следующий код:

void display(void)
{   
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(250, 250, 0);
    glRotatef(90, 1, 0, 0);
    glutSolidCone(20, 20, 20, 20);
    glTranslatef(-250, -250, 0);
    glRotatef(-90, 1, 0, 0);

    glFlush();
    glutSwapBuffers(); 
}

int main(int argc, char **argv)
{
    float x, y;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Cone");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutMotionFunc(drag);
    glutMouseFunc(click);
    glutSpecialFunc(catchKey);   

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();         
    return 0;
}

Я перевожу на середину экрана, а затем поворачиваю на 90 градусов вокруг оси x, что, по моей идее, должно создать конус на его стороне. В результате получается не конус, а линия, наклоненная не на 90, а на 45 градусов. Что я должен изменить, чтобы конус появился так, как я хочу?

1 Ответ

2 голосов
/ 28 марта 2019

Где находится матрица проекции?

Если вы не установите матрицу проекции, то координаты должны быть установлены в нормализованном пространстве устройства.В НДЦ все координаты находятся в диапазоне [-1,0, 1,0]:

например,

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.5, 0.5, 0);
glRotatef(90, 1, 0, 0);
glutSolidCone(1.0, 1.0, 20, 20);
glTranslatef(-0.5, -0.5, 0);
glRotatef(-90, 1, 0, 0);

В качестве альтернативы вы можете настроить ортографическую проекцию, которая проецирует мировые координаты 1: 1к координатам окна.Матрица проекции может быть установлена ​​с помощью glOrtho:

например

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 500.0, 500.0, 0.0, -100.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(250, 250, 0);
    glRotatef(90, 1, 0, 0);
    glutSolidCone(20, 20, 20, 20);
    glTranslatef(-250, -250, 0);
    glRotatef(-90, 1, 0, 0);

    glFlush();
    glutSwapBuffers(); 
}

Матрица проекции описывает отображение из трехмерных точек вида на сцене, чтобы2D точки в окне просмотра.В ортогональной проекции координаты пространства просмотра линейно отображаются на координаты пространства клипа.Координаты пространства клипа равны нормализованным координатам устройства.
Нормализованные координаты устройства линейно отображаются в прямоугольник области просмотра.Прямоугольник области просмотра может быть определен как glViewport.Первоначально он определяется размером окна.


Обратите внимание, что рисование с помощью glBegin / glEnd последовательностей и набора матриц с фиксированными функциями устарело с десятилетий.См. конвейер с фиксированными функциями и Legacy OpenGL .Прочитайте о Vertex Specification и Shader , чтобы узнать о современном способе рендеринга.

...