Zakładam że o ten wątek chodzi (dlaczego nowy wątek?): http://4programmers.net/Forum/C_i_C++/248986-opengl_-_jak_wygenerowac_animacje_klatka_po_klatce?p=1122578#id1122578
Kopiuj
angle = angle_rad * (float)3.14159 / (float)180;
x = (float)sin(angle) * promien_oscylacji;
y = (float)cos(angle) * promien_oscylacji;
Ale liczysz sinus z kąta w stopniach, a nie radianach. To nigdy nie jest dobry pomysł, nawet we wzorze masz wyszczególnione:
Kopiuj
kat_oscylacji += czas_klatki * szybkosc_oscylacji;
x_trojkata = cos(kat_oscylacji w radianach) * promien_oscylacji;
y_trojkata = sin(kat_oscylacji w radianach) * promien_oscylacji;
1
glTranslated(x_trojkata, y_trojkata, 0.0);
No i kompletnie bez sensu jest fragment:
Kopiuj
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);
}
Tzn. ta pętla - w wyniku wszystko się przesunie 365/5 razy, i efekt wyjściowy będzie żaden albo prawie żaden.
Kąt oscylacji to właśnie to co powinno być za angle_rad, i glTranslate wołasz raz na klatkę tylko
Jeju chyba nie ten kod Ci podałem:
On teraz wygląda tak:
Kopiuj
#include "glut.h"
#include "math.h"
#include "time.h"
float x = 0, y = 0;
double kat_oscylacji, czas_trwania_klatki, poprzednia_klatka, szybkosc_oscylacji, promien_oscylacji;
double angle, obecna_klatka, angle_rad = 0, a=1.0f, b=0.0f;
int znak = 1;
static void timerCallback(int value)
{
promien_oscylacji = 0.045;
angle = angle_rad * 3.14159 / 180;
x = (float)sin(angle) * promien_oscylacji;
y = (float)cos(angle) * promien_oscylacji;
glTranslatef(x, y, 0);
glColor3f(0.0f, a, b);
glRotatef(15, 0.0f, 0.0f, 1.0f);
if (a < 0.02) znak = -1;
if (a == 1) znak = 1;
a -= (1.0f / 72)*znak;
b += (1.0f / 72)*znak;
angle_rad += 5;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
I mimo tego, że ustawiałem współrzędne, że środek trójkąta pokrywał się z środkiem okienka to i tak nie wychodziło.