gluLookAt с конусом не показывает ожидаемый результат - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь посмотреть на конус в 3D, для которого я использовал gluLookAt.Я рисую конус в середине экрана в позиции (250, 250, 0), а затем смотрю на него камерой над источником, смотрящей в середину.На выходе получается круг, в отличие от конуса, который я ожидал увидеть.Кажется, что камера вместо этого также находится в точке (250,250,0), но она указана в gluLook, при этом она должна быть выше начала координат.Что я здесь пропускаю?

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(250, 250, 0);
    glutSolidCone(30, 10, 20, 20);
    glTranslatef(-250, -250, 0);

    gluLookAt(0, 0, 100, 250, 250, 0, 0, 0, 1);

    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();         //calls do_one_simulation_step, keyboard, display, drag, reshape
    return 0;
}

1 Ответ

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

Несколько вопросов:

  • Установите матрицу камеры, , затем Draw. То, как вы сейчас это делаете, ваш gluLookAt() не делает ничего полезного.
  • Матрица проекции идентичности по умолчанию, вероятно, не та, которую вы хотите. Установите реальное перспективное преобразование, используя gluPerspective() или glFrustum().
  • Ваши gluLookAt() координаты глаз / центр были немного странными; Я положил глаз на (50, 50, 50) и установил его, чтобы посмотреть на источник.

Все вместе:

cone screenshot

#include <GL/glut.h>
#include <GL/GLU.h>

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

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective( 60.0, w / h, 1.0, 1000.0 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    gluLookAt( 50, 50, 50, 0, 0, 0, 0, 0, 1 );

    glutWireCone( 10, 30, 20, 20 );

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize( 500, 500 );
    glutCreateWindow( "Cone" );
    glutDisplayFunc( display );
    glEnable( GL_DEPTH_TEST );
    glutMainLoop();
    return 0;
}
...