Как вращать объект и как оставить освещение неподвижным?(OpenGL) - PullRequest
2 голосов
/ 18 августа 2010

У меня есть куб, который я хочу вращать. У меня также есть источник света GL_LIGHT0. Я хочу повернуть куб и оставить источник света зафиксированным на своем месте. Но источник света вращается вместе с моим кубом. Я использую OpenGL ES 1.1 Вот фрагмент моего кода, чтобы сделать мой вопрос более ясным.

GLfloat glfarr[] = {...} //cube points
GLubyte glubFaces[] = {...}
Vertex3D normals[] = {...} //normals to surfaces

const GLfloat light0Position[] = {0.0, 0.0, 3.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
glEnable(GL_LIGHT0);

for(i = 0; i < 8000; ++i)
{
        if (g_bDemoDone) break;
        glLoadIdentity();

        glTranslatef(0.0,0.0, -12); 
        glRotatef(rot, 0.0, 1.0,1.0);
        rot += 0.8;
        glClearColor(0, 0, 0, 1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);

        glNormalPointer(GL_FLOAT, 0, normals);

        glVertexPointer(3, GL_FLOAT, 0, glfarr);
        glDrawElements(GL_TRIANGLES, 3*12, GL_UNSIGNED_BYTE, glubFaces);

        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
        eglSwapBuffers(eglDisplay, eglSurface);
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Исправлено по отношению к чему? Положение света преобразуется текущей матрицей MODELVIEW, когда вы делаете glLightfv(GL_LIGHT0, GL_POSITION, light0Position);

Если вы хотите, чтобы он двигался вместе с кубом, вам нужно переместиться на glLightfv(GL_LIGHT0, GL_POSITION, light0Position); после вызовов перевода и вращения.

0 голосов
/ 18 августа 2010

Кажется, проблема в том, что вы вращаете матрицу вида модели , а не сам куб. По сути, вы перемещаете камеру.

Чтобы повернуть только куб, вам нужно повернуть вершины, из которых состоит куб. Обычно это делается с помощью библиотеки (GLUT или чего-то подобного) или простого трига. Вы будете работать с данными вершин, хранящимися в массиве, до вызова glDrawElements. Вы можете / не можете или хотите изменить нормали или координаты текстуры, это зависит от ваших эффектов и от того, как это будет выглядеть.

...