Задать вопрос
@mastanggt

Почему gluLookAt не меняет положение камеры?

Собственно вопрос.
Есть простая программа, где друг за другом нарисованы 2 круга разных цветов, при нажатии на кнопку нужно чтобы касера меняла положение, и смотрела на эти круги с другой стороны.
По какой-то причине gluLookAt не отрабатывает, или просто я где-то накосячил :(
Прошу, подскажите в чем проблема

Код
/* gcc test.c -o test -lGL -lGLU -lglut  -lXi -lXmu */

#include <stdlib.h>
#include <stdio.h>
/* подключаем библиотеку GLUT */
#include <GL/glut.h>
#include <math.h>
/* начальная ширина и высота окна */
GLint Width = 500, Height = 500;
int R = 1;
int LOOK = 0;
float eyeX = 0,eyeY = 0,eyeZ = 0, lookX = 0,lookY = 0,lookZ = 0, upX = 0,upY = 1,upZ = 0;




void changeLOOK() {
    if (LOOK == 1) {
        LOOK = 0;
        eyeZ = -4.0;
    }
    else {
        LOOK = 1;
        eyeZ = 4.0;
    }
}
void Circle() 
{

    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -2.0f);

    glColor3ub(0,0,255);
    glBegin(GL_TRIANGLE_FAN);
        glVertex2f(Width/2, Height/2);
        for (int i = 0; i < 100; i++){
            float angle = (float)i / 3.1415f * 100 * 2.0;
            glVertex2f(Width/2-cos(angle)*100, Height/2-sin(angle)*100);
        }
    glEnd();

    glLoadIdentity();

    glTranslatef(5.0f, 5.0f ,2.0f);

    glColor3ub(255,0,0);
    glBegin(GL_TRIANGLE_FAN);
        glVertex2f(Width/2, Height/2);
        for (int i = 0; i < 100; i++){
            float angle = (float)i / 3.1415f * 100 * 2.0;
            glVertex2f(Width/2-cos(angle)*100, Height/2-sin(angle)*100);
        }
    glEnd();


}

void Display(void)
{
  
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    Circle();


    glLoadIdentity();
    gluLookAt(eyeX, eyeY, eyeZ, 
              lookX, lookY, lookZ, 
              upX, upY, upZ);
    glFinish();

}



/* Функция вызывается при изменении размеров окна */
void Reshape(GLint w, GLint h)
{
    Width = w;
    Height = h;

    /* устанавливаем размеры области отображения */
    glViewport(0, 0, w, h);

    /* ортографическая проекция */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //glFrustum(0, w, 0, h, 1, 200.0);
    glOrtho(0, w, 0, h, -10, 10);

    glMatrixMode(GL_MODELVIEW);
}

/* Функция обрабатывает сообщения от клавиатуры */
void Keyboard(unsigned char key, int x, int y)
{
#define ESCAPE '\033'
#define key_n 'n'

    if( key == ESCAPE )
        exit(0);
    if (key == key_n)
    {
        printf("eyeX = %f eyeY = %f eyeZ = %f \n",eyeX, eyeY, eyeZ );
        printf("lookX = %f lookY = %f lookZ = %f \n",lookX, lookY, lookZ );
        printf("upX = %f upY = %f upZ = %f \n",upX, upY, upZ );
        printf("-------------------------\n");
        glMatrixMode(GL_MODELVIEW);
        changeLOOK();

    
    }

}

/* Главный цикл приложения */
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowPosition(700, 0);
    glutInitWindowSize(Width, Height);
    glutCreateWindow("red square");

    glutDisplayFunc(Display);

    glutReshapeFunc(Reshape);
    glutKeyboardFunc(Keyboard);

    glutMainLoop();
    return 1;
}

  • Вопрос задан
  • 152 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
TrueBers
@TrueBers
Гуглю за еду
Потому что хватит учить технологии 1999 года!
Учите современный OpenGL, с конвеером, нормальным батчингом, шейдерами и прочими плюшками.

В том, что вы учите нет никакого смысла, в современных версиях это уже всё удалено из стандарта и не поддерживается. Придётся заново переучиваться потом, если вы, конечно, не желаете писать игры под NVidia MX440, советую как можно раньше начать учить хотя бы OpenGL 3.3, пока не поздно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы