Почему GLfloat требует глобальной области видимости? - PullRequest
1 голос
/ 10 марта 2011

Когда объявляется как локальная переменная, вращение объекта GLfloat не происходит.Когда он объявлен как глобальный, он будет соответствующим образом вращаться, в чем причина того, что он требует глобального?Вызывает ли функция display () программы OpenGL что-то еще?

Ответы [ 2 ]

5 голосов
/ 10 марта 2011

Я думаю, что вы можете пытаться сделать что-то вроде этого (с rot в функции, не глобальной):

GLfloat rot = 0.1;
glRotatef(rot, 0.0f, 1.0f, 0.0f);

, который не будет вращать объекты, нарисованные после.

Это потому, что glRotatef работает с абсолютным вращением. Вы применяете постоянное вращение 0,1 для каждого изображения, которое вы рисуете, и поэтому они не двигаются.

Вам не нужно хранить rot глобально, вы можете сохранить его вместе с моделью объекта, который вы вращаете, и сделать это так:

glRotatef(myObj->rotation, 0.0f, 1.0f, 0.0f);
... draw myObj->triangles ...
myObj->rotation += speed;   // speed can be e.g. 0.1

Как примечание: имейте в виду, что если вы сделаете myObj->rotation += speed; в функции рендеринга, ваша скорость вращения будет пропорциональна вашей скорости рендеринга (быстрее на более быстрых компьютерах), что обычно нежелательно. Чтобы избежать этого, вы можете проверить истекшее время и оценить его, только если это время, скажем, превышает 50 мс.

2 голосов
/ 10 марта 2011

В ответ на ваш комментарий

но как мне создать модель моего объекта?Я просто использую простые функции, такие как glVertex3f ()

Вместо жесткого кодирования glVertex, glColor ... вы можете отделить ваши модели от рендеринга (вызовы glVertex, glColor ...) во многих отношениях.Давайте сначала поговорим о простой для понимания (но неэффективной) версии: связанный список треугольников:

#define triangleList struct _triangleList
struct _triangleList {
    float ax, ay, az, bx, by, bz, cx, cy, cz;
    triangleList* next; // this has to be a null-pointer if this is the last link
}

и модель-структура для их использования:

#define model struct _model
struct _model {
    float rotationX;
    triangleList* firstTriangle;
}

Вызатем можно сделать общую функцию рендеринга:

void myRenderFunc(model* aModel) {
    triangleList* current = aModel->firstTriangle;
    glBegin(GL_TRIANGLES);
    glRotate(aModel->rotationX,1.0,0.0,0.0);
    while(current!=0) {
        glVertex3f(current->ax,current->ay,current->az);
        ...
        current = current -> next;
    }
    glEnd();
}

Теперь у вас есть общая (но медленная) функция рендеринга: для рендеринга новых моделей вам не нужно писать glBegins / glVertex / glColor ... но просто создайте новую модельи передайте его в renderFunc (который вы должны расширить для поддержки цвета ...).Теперь быстрое упоминание о том, как сделать это быстрее (если это необходимо): вместо вызова glVertex ... читайте о массивах вершин или даже объектах вершинных буферов.Но общая идея отделения ваших моделей от функции рендеринга работает и с ними.

...