Obrót wokół środka - OpenGL.

0

Witam mam problem:

-mój trójkąt miał oscylować wokół środka okienka, i równocześnie w obracać się wokół własnego środka:

Jednak jak daję obrót w okół osi 'z' (tej której nie używam) to dzieją się różne cyrki.

Zaś gdy pokrywam wierzchołki trójkąta, tak aby środek trójkąta zgadzał się z środkiem okienka, to obracanie działa dobrze, ale w wyniku oscylacji wyjeżdża mi poza okienko.

Filmiki:

z rotacją wokół osi 'z', wierzchołek pokrywa się z lewą krawędzią okienka: http://wrzucacz.pl/file/2721426606258

bez rotacji, z ustawionym środkiem trójkąta w środku okienka: http://wrzucacz.pl/file/1791426605621

z rotacją wokół osi 'z', z ustawionym środkiem trójkąta w środku okienka: http://wrzucacz.pl/file/5591426605657

0

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

        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:

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:

    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

0
msm napisał(a):

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

        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:

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:

    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:

#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.

0

No to moja uwaga dalej aktualna:

        angle = angle_rad * 3.14159 / 180;
        x = (float)sin(angle) * promien_oscylacji;
        y = (float)cos(angle) * promien_oscylacji;

Liczysz sinus z kąta w stopniach, a powinieneś w radianach

Oraz tutaj:

angle_rad += 5;

Brakuje Ci mnożenia przez czas klatki.

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