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_srodka_ekranu_-_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_srodka_ekranu_-_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