Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

OpenGL - jak wygenerować animację klatka po klatce.

#1
OpenGL - jak wygenerować animację klatka po klatce.
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:

Kod:
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: http://wklej.org/id/1664525/


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ć?
 System operacyjny: windows_seven Przeglądarka: firefox
#2
RE: OpenGL - jak wygenerować animację klatka po klatce.
Witam, chciałem zrobić to przy użyciu funkcji glRotate, ale coś nie chciało działać (z OpenGL dawno temu korzystałem), dlatego masz nieco inaczej zrobiony przykład (obracający się trójkąt):
Kod:
#include <GL/glut.h>
#include <GL/glu.h>
#include <math.h>
#include <stdio.h>

double angle = 0;
typedef struct
{
    double x, y;
} POINT;
typedef struct
{
    POINT A, B, C;
} TRIANGLE;

TRIANGLE triangle;

void draw_triangle(TRIANGLE t)
{
    glBegin(GL_TRIANGLES);
        glVertex2d(t.A.x * cos(angle) - t.A.y * sin(angle), t.A.x * sin(angle) + t.A.y * cos(angle));
        glVertex2d(t.B.x * cos(angle) - t.B.y * sin(angle), t.B.x * sin(angle) + t.B.y * cos(angle));
        glVertex2d(t.C.x * cos(angle) - t.C.y * sin(angle), t.C.x * sin(angle) + t.C.y * cos(angle));
    glEnd();
}

void scene()
{
    glColor3d(0.0, 1.0, 0.0);
    glPushMatrix();
        draw_triangle(triangle);
    glPopMatrix();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    scene();

    glFlush();
    glutSwapBuffers();
}

void timer(int value)
{
    if (value == 0)
    {
        if (angle > 2*M_PI)
            angle -= 2*M_PI;
        else if (angle < 0)
            angle += 2*M_PI;
        angle += M_PI / 128.0;
        glutTimerFunc(25, timer, 0);
    }
}

void init()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glutTimerFunc(25, timer, 0);
}

int main(int argc, char **argv)
{
    triangle.A.x = 0.25;
    triangle.A.y = 0.25;
    triangle.B.x = -0.25;
    triangle.B.y = 0.25;
    triangle.C.x = 0.25;
    triangle.C.y = -0.25;

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(500, 500);
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutCreateWindow("test");
    init();
    glutMainLoop();
    return 0;
}
 System operacyjny: linux Przeglądarka: firefox
#3
RE: OpenGL - jak wygenerować animację klatka po klatce.
(17.03.2015, 20:49)Szachista napisał(a): Witam, chciałem zrobić to przy użyciu funkcji glRotate, ale coś nie chciało działać (z OpenGL dawno temu korzystałem), dlatego masz nieco inaczej zrobiony przykład (obracający się trójkąt):


Ja to zrobiłem tak (dwa razy inaczej):

- trójkąt porusza się od lewej do prawej, obracając się wokół osi 'x' i zmieniając kolor od zielonego do niebieskiego płynnie: http://wklej.org/id/1665313/ - kombinowałem tu z licznikiem itd.

i drugi raz właśnie klatka po klatce, przynajmniej mi się tak wydaje, że trójkąt porusza się po okręgu, obraca się wokół osi 'z' (z tym miałem problem, bo jeśli zmienię prędkość obrotu to wszystko się sypie), no i też zmienia się kolor: http://wklej.org/id/1665314/
 System operacyjny: windows_seven Przeglądarka: firefox
#4
RE: OpenGL - jak wygenerować animację klatka po klatce.
A trzeba było mi zajrzeć do dokumentacji OpenGL.

EDIT: Teraz poprawnie działa (na 1 pełny obrót trójkąta przypadają 3 obiegi wokół środka).
Kod:
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

double angle = 0;
typedef struct
{
    double x, y;
} POINT;
typedef struct
{
    POINT A, B, C;
} TRIANGLE;

TRIANGLE triangle;

void draw_triangle(TRIANGLE t)
{
    glColor3d(0.0, cos((angle/360.0)*M_PI)*cos((angle/360.0)*M_PI), sin((angle/360.0)*M_PI)*sin((angle/360.0)*M_PI));
    glBegin(GL_TRIANGLES);
        glVertex2d(t.A.x, t.A.y);
        glVertex2d(t.B.x, t.B.y);
        glVertex2d(t.C.x, t.C.y);
    glEnd();
    glColor3d(0.0, 0.0, 0.0);
    glBegin(GL_POINTS);
        glVertex2d((t.A.x+t.B.x+t.C.x)/3, (t.A.y+t.B.y+t.C.y)/3);
    glEnd();
}

void draw_circle(double r)
{
    double alpha;
    glColor3d(1.0, 1.0, 1.0);
    glBegin(GL_LINE_STRIP);
        for (alpha = 0; alpha <= 360; alpha += 0.5)
            glVertex2d(r*cos(alpha*M_PI/180), r*sin(alpha*M_PI/180));
    glEnd();
}

void scene()
{
    draw_circle(0.5);
    glPushMatrix();
        glRotated(angle, 0.0, 0.0, 1.0);
        glTranslated(0.5, 0.0, 0.0);
        glRotated(-angle+angle/3, 0.0, 0.0, 1.0);
        draw_triangle(triangle);
    glPopMatrix();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    scene();

    glFlush();
    glutSwapBuffers();
}

void timer(int value)
{
    if (value == 0)
    {
        if (angle > 1080)
            angle -= 1080;
        else if (angle < 0)
            angle += 1080;
        angle++;
        glutTimerFunc(10, timer, 0);
    }
}

void init()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glutTimerFunc(10, timer, 0);
}

int main(int argc, char **argv)
{
    double a = 0.5, h_23 = a*sqrt(3)/3;
    triangle.A.x = h_23*cos(-M_PI/6);
    triangle.A.y = h_23*sin(-M_PI/6);
    triangle.B.x = 0;
    triangle.B.y = h_23;
    triangle.C.x = h_23*cos(M_PI*7/6);
    triangle.C.y = h_23*sin(M_PI*7/6);

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(500, 500);
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutCreateWindow("test");
    init();
    glutMainLoop();
    return 0;
}
 System operacyjny: linux Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki (OpenGL - jak wygenerować animację klatka po klatce.)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
Question Obrót wokół własnej osi -OpenGL kamillo94 1 8925 13.01.2016, 16:06
Ostatni post: Szachista
  Dlaczego animacja wykonuje się skokowo, a nie płynnie klatka po klatce. Dreamer1x6xX 10 18495 06.06.2015, 03:07
Ostatni post: Dreamer1x6xX
  Jak zrobić z tego animację skoku? Dreamer1x6xX 5 9820 29.05.2015, 20:02
Ostatni post: Szachista

Skocz do: