Skocz do zawartości

C z biblioteką opengl, problem z rotacją


Recommended Posts

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

 

Link to post
Share on other sites

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.
 

Link to post
Share on other sites

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?

Link to post
Share on other sites

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 łatwe
funkcja ta obraca tak jakby cały obrazek a ja potrzebuje tylko jednego elementu, który by się obracał

Edytowane przez napierniczak321
Link to post
Share on other sites

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.

  • Popieram 1
Link to post
Share on other sites

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 :)

Link to post
Share on other sites

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.

  • Popieram 1
Link to post
Share on other sites

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;
}

Link to post
Share on other sites

W sumie zaczęło wreszcie coś się ruszać ^^ , jednakże porusza się cały obrazek i to z dużą prędkością :D

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 :D
Po rozpędzeniu mamy wręcz mindfuck :D

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 przez napierniczak321
Link to post
Share on other sites

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

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...