OpenGL - jak wygenerować animację klatka po klatce.

0

Witajcie nie mam pojęcia jak poruszyć w ogóle, coś nie używając inkrementacji licznika. Tzn. całe zadanie, które miałem wykonać opierałem na tym, że zwiększał się licznik do jakiegoś momentu, potem zerował i przez to poruszała się moja figura.

Jeden z użytkowników tego forum, napisał mi taki pseudokod, do napisania, ale nie mam pojęcia jak napisać i w którym miejscu, żeby klatki się renderowały, bez używania licznika.

To fragment tego pseudokodu:

kat_oscylacji += czas_klatki * szybkosc_oscylacji;
x_trojkata = cos(kat_oscylacji w radianach) * promien_oscylacji;
y_trojkata = sin(kat_oscylacji w radianach) * promien_oscylacji;

glTranslated(x_trojkata, y_trojkata, 0.0);

A to mój szkielet podstawowy programu:

#include "glut.h"
#include "math.h"

void display(void)
{
    /* clear window */

    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glTranslatef(x, y, 0);
    //glRotatef(kat,0,0,1); rotacja w okolo osi z

    /* draw unit square polygon */
    glBegin(GL_TRIANGLES);
    glVertex2f(-1, -0.5);
    glVertex2f(-0.5, 0.4);
    glVertex2f(0, -0.5);

    glEnd();

    /* flush GL buffers */
    glPopMatrix();
    glFlush();
}

static void Key(unsigned char key, int x_d, int y_d)
{

    //blablabla
}

void init()
{
    /* set clear color to black */
    glClearColor(0.0, 0.0, 0.0, 0.0);

    /* set up standard orthogonal view with clipping */
    /* box as cube of side 2 centered at origin */
    /* This is default view and these statement could be removed */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("simple");
    glutDisplayFunc(display);
    glutKeyboardFunc(Key);
    init();
    glutMainLoop();

    return 0;
}

Gdzie miałbym to dopisać i to mają być normalne zmienne, tzn. czas trwania klatki, szybkość oscylacji i zaś mam je jakoś inkrementować, czy jak? Bo nie mam pojęcia. Jakiejś dodatkowej funkcji do określania czasu trwania klatki mam użyć?

0

Możesz robić glutPostRedisplay po każdym update, w ten sposób display będzie cały czas wywoływane.

Szybkość i promień oscylacji to parametry (normalne zmienne/stałe), natomiast czas trwania klatki wyliczasz przy każdym rysowaniu
W pseudokodzie:

czas_trwania_klatki = time() - poprzednia_klatka
poprzednia_klatka = time()

Edit: dlaczego nie tutaj - http://4programmers.net/Forum/C_i_C++/248945-oscylacja_wokol_srodkaekranu-_opengl ?

0
msm napisał(a):

Możesz robić glutPostRedisplay po każdym update, w ten sposób display będzie cały czas wywoływane.

Szybkość i promień oscylacji to parametry (normalne zmienne/stałe), natomiast czas trwania klatki wyliczasz przy każdym rysowaniu
W pseudokodzie:

czas_trwania_klatki = time() - poprzednia_klatka
poprzednia_klatka = time()

Edit: dlaczego nie tutaj - http://4programmers.net/Forum/C_i_C++/248945-oscylacja_wokol_srodkaekranu-_opengl ?

Bo teraz mam wolny czas, a zaś idę na uczelnię, więc możesz mi powiedzieć dlaczego ten kod nie trybi? I po co jest w ogóle ta zmienna kat_oscylacji - gdzie go mam wstawić?

Mój kod wygląda tak:


static void timerCallback(int value)
{
    promien_oscylacji = 0.01;
    czas_klatki = 0.04;
    szybkosc_oscylacji = 3;

    kat_oscylacji += czas_klatki * szybkosc_oscylacji;

    for (int angle_rad = 0; angle_rad < 365; angle_rad = angle_rad + 5)
    {
        angle = angle_rad * (float)3.14159 / (float)180;
        x = (float)sin(angle) * promien_oscylacji;
        y = (float)cos(angle) * promien_oscylacji;
        glTranslatef(x, y, 0);

    }

    glutPostRedisplay();
    glutTimerFunc(50, timerCallback, value);

void init()
{
    /* set clear color to black */
    glClearColor(0.0, 0.0, 0.0, 0.0);

    /* set up standard orthogonal view with clipping */
    /* box as cube of side 2 centered at origin */
    /* This is default view and these statement could be removed */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    timerCallback(0);

}
}

I trójkąt co prawda się porusza, ale idzie pionowo w górę, dlaczego? I do czego służy ta zmienna kat_oscylacji, gdzie ją wstawić, bo jak widzisz jest zainicjowana, ale nigdzie jej nie wstawiłem, bo nie wiem gdzie.

I ta funkcja time() - "prosi" o argument, co ma nim być?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0