Opengl, вращающаяся сцена со стационарным светом

У меня проблема с моим игровым проектом OpenGL. Я определил массивы со свойствами света:

GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { 3.0, 20.0, 3.0, 0.0 };

Я использую это с:

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

Я определил класс камеры и метод обновления:

void update()
{
    glLoadIdentity();
    x = dist * sin(alpha) + 3;
    z = dist * cos(alpha) + 3;
    gluLookAt(x, y, z, 3, 5, 3, 0, 1, 0);
    if (y <= 1) y = 1;

    cout << "x " << x << "y: " << y << "z: " << z << "dist: " << dist << endl;
    glutPostRedisplay();
}

Центральная точка моей сцены (3,5,3). Я хочу вращать сцену вокруг этой точки и ее работы. Но у меня есть проблема со светом - он тоже "вращается" - я не знаю, как это описать.

Я хочу простое освещение и вращение камеры вокруг точки.

1 ответ

Решение

Фиксированная функция GL сохраняет положение света в глазном пространстве. Для этого положение света умножается на текущую матрицу ModelView во время glLightfv(..., GL__POSITION, ...) звоните. Если вы перемещаете камеру, не изменяя положение источника света, он имеет эффект света, который остается неподвижным относительно камеры.

Если вы хотите, чтобы источник света был неподвижен в мире, вы должны загрузить матрицу вида (и только матрицу вида) и указать положение источника света в мировом пространстве при каждом изменении матрицы вида.

Другие вопросы по тегам