napierniczak321 11 Napisano 18 Maja 2013 Udostępnij Napisano 18 Maja 2013 CześćRobię zadanie z programowania i mam problem. Otóż trzeba namalować obrazek korzystając z biblioteki opengl. Jak na razie zrobiłem coś takiego http://logosensor.wordpress.com/about/ tylko zamiast kropki wstawiłem sześciokąt foremny a do niego chciałbym wstawić kolejny okrąg a do niego sześciokąt itd. Nie wiem jak zrobić aby te sześciokąty się obracały Pewnie to jest banalny problem ale nie potrafię sobie z nim poradzićP.S. nie jestem za bardzo obeznany z opengl, dopiero zaczynam coś w tym kierunku robić. Cytuj Link to post Share on other sites
Rocik 21 Napisano 18 Maja 2013 Udostępnij Napisano 18 Maja 2013 (edytowane) Powinna być funkcja glRotate jezeli uzywasz starych wersji(w tym cały webgl), jezeli nowsze to musisz sam przemnozyc macierze. Edytowane 18 Maja 2013 przez Rocik Cytuj Link to post Share on other sites
napierniczak321 11 Napisano 18 Maja 2013 Autor Udostępnij Napisano 18 Maja 2013 Chciałbym aby sześciokąty obracały się przez cały czas, kiedy uruchomione jest okno a funkcja glRotate chyba mi tego nie umożliwi Nie wiem jak to zrobić czy jakoś uzależnić to od czasu systemowego Jestem jeszcze żółtodziobem w tych sprawach niestety.Do szczęścia brakuje mi tylko tej ciągłej rotacji. Cytuj Link to post Share on other sites
Rocik 21 Napisano 19 Maja 2013 Udostępnij Napisano 19 Maja 2013 glRotate ustawia rotacje. Strzelam że wystarczy zrobić cos takiego: glRotatef(angle, 0.0f, 0.0f, 0.0f); angle+=1.0f; Nie wiem w czym tym robisz, wiec też ciezko poradzić. Webgl, czy moze normalnie w aplikacji okienkowej? Cytuj Link to post Share on other sites
napierniczak321 11 Napisano 19 Maja 2013 Autor Udostępnij Napisano 19 Maja 2013 (edytowane) Zadanie robię w Code Blocks. Tworząc nowy projekt wybieram glut project i potem dodaję glut32.lib. Twój pomysł Rocik niestety nie działa Znalazłem coś takiego double kat_obrotu = M_PI/360; void timer(int v) { static double alfa = 0; alfa += kat_obrotu; if (alfa >= 2*M_PI) alfa -= 2*M_PI; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(20*cos(alfa), 5, 20*sin(alfa), 0,0,0, 0,0,1); glutPostRedisplay(); glutTimerFunc(15, timer, v); } a w main glutTimerFunc(15, timer, 0); ale ciężko jest mi to jakoś sensownie przerobić, chociaż pewnie to jest łatwefunkcja ta obraca tak jakby cały obrazek a ja potrzebuje tylko jednego elementu, który by się obracał Edytowane 19 Maja 2013 przez napierniczak321 Cytuj Link to post Share on other sites
Rocik 21 Napisano 19 Maja 2013 Udostępnij Napisano 19 Maja 2013 Zeby obracac tylko jeden mesh, musisz uzyc glrotate ponownie o tyle co poprzednio, ale w druga strone. Innym wyjsciem jest uzycie glPushMatrix i glPopMatrix . Działa to tak, że wywołujesz glPushMatrix, aktualna maciez leci na stos, tworzy sie kopia, ktora mozesz dowolnie modyfikowac, a gdy chcesz uzyc starej, wywolujesz glPopMatrix. 1 Cytuj Link to post Share on other sites
napierniczak321 11 Napisano 19 Maja 2013 Autor Udostępnij Napisano 19 Maja 2013 Wybacz ale trochę nie rozumiem co powinienem zrobić Jak na razie mam coś takiego int angle=0; glPushMatrix(); glRotatef(angle, 0.0f, 0.0f, 0.0f); angle+=1.0f; glLineWidth(5); glColor3d(1.0,0.0,1.0); glPushMatrix(); glTranslatef(0, 0, 0); glBegin(GL_LINE_LOOP); // rozpoczêcie rysowania szeœciokatu { glVertex3f( 0, 5, 0); // pierwszy wierzcho³ek glVertex3f( -h, 2.5, 0); // drugi wierzcho³ek glVertex3f( -h, -2.5, 0); // trzeci wierzcho³ek glVertex3f( 0, -5, 0); // czwarty wierzcho³ek glVertex3f( h, -2.5, 0); // pi¹ty wierzcho³ek glVertex3f( h, 2.5, 0); // szósty wierzcho³ek } glPopMatrix(); Dzięki że chcesz mi pomóc Cytuj Link to post Share on other sites
Rocik 21 Napisano 19 Maja 2013 Udostępnij Napisano 19 Maja 2013 Dla kazdego pushMatrix musi byc jeden popMatrix. W twoim przypadku bym ich nie uzywal, bo mozna to zrobić prościej. Zacznijmy od tego, ze angle zawsze bedzie rowne 0. Musisz ją zdeklarować gdzieś indziej, lub uzyć static. w glRotate musisz tez ustawic jaka oś ma być modyfikowana, wiec gdzieś musi byc 1.0f, polecam w ostatniej osi (z). Jeżeli reszta kodu jest dobrze, to nie powinno byc problemow. 1 Cytuj Link to post Share on other sites
napierniczak321 11 Napisano 19 Maja 2013 Autor Udostępnij Napisano 19 Maja 2013 Chyba robię coś źle, nadal nic nie idzie a reszta kodu raczej jest poprawna ale na wszelki wypadek przedstawię #include <windows.h> #include <GL/glut.h> #include <math.h> // Definicje kolorow: #define NIEBI 0.0, 0.0, 1.0 #define MAGEN 1.0, 0.0, 1.0 #define CYJAN 0.0, 1.0, 1.0 #define BIALY 1.0, 1.0, 1.0 #define M_PI 3.14159265358979323846 void geom(int w, int h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-18, 20, -15, 15, -30, 30); //glOrtho(-20, 20, -15, 15, -30, 30); } double przyrost = M_PI/1000; void odcinek_okregu(double prom, double kat0, double kat1) { for (double kat=kat0; kat<=kat1; kat+=przyrost) glVertex3d(prom*cos(kat), prom*sin(kat), 0); } double h=(5*sqrt(3.0))/2;//bo z moich obliczen wynika ze potrzebuje takiej liczby i z obrazka ktory wykonalem w domu void okregi(){ glLineWidth(30); glPushMatrix(); glTranslated(0, 5, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(0, -10, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(-h, 2.5, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(0, 5, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(2*h, 0, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(0, -5, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(-h, 2.5, 0); glColor4d(1.0,1.0,0.0,0); glBegin(GL_POLYGON); odcinek_okregu(5, 0, 2*M_PI); glEnd(); glPushMatrix(); glTranslated(0, 0, 0); glColor4d(NIEBI,0); glBegin(GL_LINE_STRIP); odcinek_okregu(5, 0, 2*M_PI); glEnd(); static int angle=0; //glPushMatrix(); glRotatef(angle, 0.0f, 0.0f, 1.0f); angle+=1.0f; glLineWidth(5); glColor3d(1.0,0.0,1.0); //glPushMatrix(); glTranslatef(0, 0, 0); glBegin(GL_LINE_LOOP); // rozpoczêcie rysowania szeœciokatu { glVertex3f( 0, 5, 0); // pierwszy wierzcho³ek glVertex3f( -h, 2.5, 0); // drugi wierzcho³ek glVertex3f( -h, -2.5, 0); // trzeci wierzcho³ek glVertex3f( 0, -5, 0); // czwarty wierzcho³ek glVertex3f( h, -2.5, 0); // pi¹ty wierzcho³ek glVertex3f( h, 2.5, 0); // szósty wierzcho³ek } //glPopMatrix(); glutSwapBuffers(); glEnd(); } void wyswietl(void) { glClear(GL_COLOR_BUFFER_BIT); okregi(); glFlush(); } /*double kat_obrotu = M_PI/360; void timer(int v) { static double alfa = 0; alfa += kat_obrotu; if (alfa >= 2*M_PI) alfa -= 2*M_PI; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(20*cos(alfa), 5, 20*sin(alfa), 0,0,0, 0,0,1); glutPostRedisplay(); glutTimerFunc(15, timer, v); }*/ int main(int ile_arg, char* arg[]) { glutInit(&ile_arg, arg); glutInitWindowPosition(100,100); glutInitWindowSize(600,480); glutCreateWindow("Obrazek"); //glutCreateWindow(arg[0]); glClearColor(1.0,1.0,0.0, 0.0);//na koncu jest alpha value jesli jest ustawione na 0 to jest przezroczysty a jak 1 to odwrotnie glutReshapeFunc(geom); glutDisplayFunc(wyswietl); //glutTimerFunc(15, timer, 0); glutMainLoop(); return 0; } Cytuj Link to post Share on other sites
Rocik 21 Napisano 19 Maja 2013 Udostępnij Napisano 19 Maja 2013 glutIdleFunc(wyswietl); dodaj to po glutDisplayFunc(wyswietl); I polecam zrezygnowac z glut. 1 Cytuj Link to post Share on other sites
napierniczak321 11 Napisano 19 Maja 2013 Autor Udostępnij Napisano 19 Maja 2013 (edytowane) W sumie zaczęło wreszcie coś się ruszać , jednakże porusza się cały obrazek i to z dużą prędkością Ok zmieniłem na coś takiego glRotatef(angle*0.0001, 0.0f, 0.0f, 1.0f); i prędkość na początku jest przyzwoita ale zaczyna ciągle przyspieszać, ciekawe, interesujący efekt Po rozpędzeniu mamy wręcz mindfuck Ale nawet mi się to podoba. Ok już poradziłem sobie z szybkością po prostu wtedy nie potrzebne jest angle+=1.0f; a samo angle ustawiam na 1 i działa bardzo dobrze. Dzięki za pomoc Rocik Edytowane 19 Maja 2013 przez napierniczak321 Cytuj Link to post Share on other sites
Recommended Posts
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.