CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Jak animować obiekty w OpenGL?

Jak animować obiekty w OpenGL?

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Jak animować obiekty w OpenGL?

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 11:31

Panie Baronie chciałam pokazać mój najważniejszy projekt.
Dzięki paru książkom nauczyłam się rysować w opengl no i robię sobie grę bilard.
Zrobiłam cztery bile ale te bile tylko stoją a nie wiem jak zrobić żeby one zaczęły się poruszać tak jak w bilardzie, na przykład jeżeli nacisnę klawisz S na klawiaturze czyli ten klawisz wybiorę sobie jako start i jedna bila wtedy rusza i uderza w inne bile które zaczynają się poruszać zgodnie z tym pod jakim kątem ta pierwsza bile w nie uderzy.
W załączniku przesyłam mój projekt, proszę obejrzeć i ewentualnie doradzić co jest nie tak.
Ja i moje koleżanki spędziłyśmy nad tym projektem ponad 2 miesiące.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 11:37

Nie znam się na OpenGL i na forum nie ma chyba nikogo kto by się na tym znał... :roll:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Corvis » niedziela, 8 maja 2011, 11:45

Baronie jak u ciebie ta gra chodzi wogóle ? u mnie tnie jak jasny gwint :(
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Mój najważniejszy projekt

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 11:48

U mnie działa płynnie. To kwestia ustawień karty graficznej.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez sebaskow » niedziela, 8 maja 2011, 12:23

Witam.

NIe jestem specjalistą w OpenGL wiem jednak aby poruszyć pjedyńczy obiekt należy zachować obecny stan macierzy na stosie glPuchMatrix(), następnie wykonać ruch na obiekcie i przywrócić poprzedni stan macierzy przy pomocy glPopMatrix()

Mogło by to wyglądać jak poniżej. w wartości: wartosc_x, itp. należy wstawić wartości liczbowe powodujące przesunięcie obiektu.

Kod: Zaznacz cały
glPushMatrix();
    glTranslatef(wartosc_x, wartosc_y, wartosc_z);
    RysujGLU1(rozmiar2);
    /*
        wstaw funkcję rysowania kuli która powinna sie poruszać
        pomiędzy te dwie instrukcję
        Powodują one ruch tylko tej kuli zachowująć macirze poza nimi bez
        przemieszczeń.
    */
glPopMatrix();
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows XPChrome

Re: Mój najważniejszy projekt

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 13:26

Wstawiłam wartości liczbowe ale to nic nie daje bo po wstawieniu wartości liczbowych kula nadal stoi w miejscu, te wartości liczbowe tylko określają pozycję kuli.

KOD cpp:     UKRYJ  
void __fastcall TForm1::RysujScene()
{
glRotatef(Phi3, 0.0, 1.0, 0.0);  //wokół OY
gluLookAt(0.0, 0.0, -50.0, 0,0,0, 0,1,0);   //położenie kamery
float rozmiar=50.0f;
glTranslatef(0.0, 48.0, -10.0);
RysujPodloze(rozmiar);
 float rozmiar1=1.1f;
glTranslatef(-1.0, 0.0-49, 5.0);     /*Ustalenie pozycji kuli*/
RysujGLU(rozmiar1);
 float rozmiar2=1.1f;
glTranslatef(2.3, 0.0, 0.0);     /*Ustalenie pozycji kuli*/
RysujGLU1(rozmiar2);
 float rozmiar3=1.1f;
glTranslatef(-1.0, 0.0, -3.0);     /*Ustalenie pozycji kuli*/
RysujGLU2(rozmiar3);
float rozmiar4=1.1f;
glRotatef(Phi1, 0.0, 1.0, 2.0);  //wokół OY
glTranslatef(0.0, 0.0, -18.0);    /*Ustalenie pozycji kuli*/
RysujGLU3(rozmiar4);
}
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 13:31

Z tym pomysłem żeby wstawić funkcję to dobry pomysł tylko że ja nie wiem jak tą funkcję napisać. Jeżeli znasz się na takich funkcjach to mógłbyś mi podać przykład jednej? Bardzo proszę.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez sebaskow » niedziela, 8 maja 2011, 16:08

No tak.

Tylko że te wartości liczbowe muszą się zmieniać w jakimś cyklu. Poprzez wywołanie funkcji np. OnKeyPress w formularzu lub też w równych odstępach czasowych poprzez Timer.

W funkcji "RusujScene()" należy wstaić np. zmienną statyczną która będzie inkrementowała wartości.

Kod: Zaznacz cały
static float wartosc_x = 0.0;
wartosc_x += 0.02;


Wówczas przy każdym wywołaniu "RysujScenę()" wartość będzie zwiększana a przy tym obekt zawarty pomiędzy glPushMatrix i glPopMatrix będzie się poruszał.

Możemy tam również wstawić zmienne globalne które będą zwiększane lub zmniejszane przy pomocy przycisków np. "s" które będzie przesuwało oś x ( wartosc_x += 0.02; ) natomiast np. "a" będzie powodowało zmniejszanie wartosci ( wartosc_x -= 0.02; )

Oczywiście wywołujemy to w zdarzeniu np. OnKeyPres.

Na wykonanie algorytmu przesuwania kuli są conajmniej 3 metody.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 18:36

Działa bila się porusza to już coś, dzięki Tobie wiem już jak używać tej funkcji, tylko że bila gdy dotrze do tamtych bil przenika przez nie tak jak by nie istniały.
A co bym musiała zmienić żeby ta bila nie przenikała tylko w nie uderzyła i w zależności od tego pod jakim kątem by uderzyła one by zaczęły się poruszać?
Proszę zobacz na kod jak zrobiłam, oto kod:

KOD cpp:     UKRYJ  
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <Jpeg.hpp>
#include "GLWektory.h"
#include "Teksturowanie.h"

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)
        : TGLForm(Owner)
{
ObslugaMyszy=true;
debug_mode=false;
SwobodneObroty=true;
Obracaj(10.0f,0.0f,0.0f);
Caption=(AnsiString)"GLForm, OpenGL "+(char*)glGetString(GL_VERSION);
czyTeksturowacSfere=true;
Teksturowanie=true;
AnsiString nazwyPlikow[TEKSTURY_ILOSC]={"tekstura1.bmp","tekstura2.bmp","tekstura3.bmp","tekstura4.bmp","tekstura5.bmp"};;
glGenTextures(TEKSTURY_ILOSC,Tekstury); //tworzenie tablicy tekstur
for(int i=0;i<TEKSTURY_ILOSC;i++)
{
int TeksturaSzer,TeksturaWys;
unsigned long* Tekstura=WczytajTeksture(nazwyPlikow[i],TeksturaSzer,TeksturaWys);
if (Tekstura!=NULL)
{
glBindTexture(GL_TEXTURE_2D,Tekstury[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,TeksturaSzer,TeksturaWys,GL_RGBA,GL_UNSIGNED_BYTE,Tekstura);
delete[] Tekstura; //oryginalne dane sa usuwane

}
}
}

void __fastcall TForm1::RysujScene()
{
glRotatef(Phi3, 0.0, 1.0, 0.0);  //wokół OY
gluLookAt(0.0, 0.0, -50.0, 0,0,0, 0,1,0);   //położenie kamery
float rozmiar=50.0f;
glTranslatef(0.0, 48.0, -10.0);
RysujPodloze(rozmiar);
 float rozmiar1=1.1f;
glTranslatef(-1.0, 0.0-49, 5.0);     /*Okreslenie pozycji kuli*/
RysujGLU(rozmiar1);
 float rozmiar2=1.1f;
glTranslatef(2.3, 0.0, 0.0);     /*Okreslenie pozycji kuli*/
RysujGLU1(rozmiar2);
 float rozmiar3=1.1f;
glTranslatef(-1.0, 0.0, -3.0);     /*Okreslenie pozycji kuli*/
RysujGLU2(rozmiar3);
float rozmiar4=1.1f;
static float wartosc_x = 0.0;
PozycjaZ1 += 0.02;
glRotatef(Phi1, 0.0, 1.0, 2.0);  //wokół OY
glTranslatef(PozycjaX1-0, PozycjaY1, PozycjaZ1-18);     /*Okreslenie pozycji kuli*/
RysujGLU3(rozmiar4);
}

void __fastcall TForm1::RysujPodloze(float krawedz) const
{
        const float a=krawedz;

   glBindTexture(GL_TEXTURE_2D,Tekstury[0]);
        glBegin(GL_QUADS);
        //tylnia

        //dolna
   glNormal3f(0,-1,0);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-a,-a,a);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(a,-a,a);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(a,-a,-a);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-a,-a,-a);
        glEnd();

   glBindTexture(GL_TEXTURE_2D,NULL);
}

void __fastcall TForm1::RysujGLU(float rozmiar)
{
glBindTexture(GL_TEXTURE_2D,Tekstury[1]); /*Piszemy tylko wtedy jeżeli bryła ma być teksturowana*/
glColor3f( 1.0f, 1.0f, 0.0f );
GLUquadricObj* kwadryka=gluNewQuadric();
gluQuadricDrawStyle(kwadryka, GLU_FILL);
{
gluQuadricTexture(kwadryka,GL_TRUE);
}
gluSphere(kwadryka, rozmiar, 50, 50);
gluDeleteQuadric(kwadryka);
}

void __fastcall TForm1::RysujGLU1(float rozmiar)
{
glBindTexture(GL_TEXTURE_2D,Tekstury[2]); /*Piszemy tylko wtedy jeżeli bryła ma być teksturowana*/
glColor3f( 1.0f, 1.0f, 0.0f );
GLUquadricObj* kwadryka=gluNewQuadric();
gluQuadricDrawStyle(kwadryka, GLU_FILL);
{
gluQuadricTexture(kwadryka,GL_TRUE);
}
gluSphere(kwadryka, rozmiar, 50, 50);
gluDeleteQuadric(kwadryka);
}

void __fastcall TForm1::RysujGLU2(float rozmiar)
{
glBindTexture(GL_TEXTURE_2D,Tekstury[3]); /*Piszemy tylko wtedy jeżeli bryła ma być teksturowana*/
glColor3f( 1.0f, 1.0f, 0.0f );
GLUquadricObj* kwadryka=gluNewQuadric();
gluQuadricDrawStyle(kwadryka, GLU_FILL);
{
gluQuadricTexture(kwadryka,GL_TRUE);
}
gluSphere(kwadryka, rozmiar, 50, 50);
gluDeleteQuadric(kwadryka);
}

void __fastcall TForm1::RysujGLU3(float rozmiar)
{
glBindTexture(GL_TEXTURE_2D,Tekstury[4]); /*Piszemy tylko wtedy jeżeli bryła ma być teksturowana*/
glColor3f( 1.0f, 1.0f, 0.0f );
GLUquadricObj* kwadryka=gluNewQuadric();
gluQuadricDrawStyle(kwadryka, GLU_FILL);
{
gluQuadricTexture(kwadryka,GL_TRUE);
}
gluSphere(kwadryka, rozmiar, 50, 50);
gluDeleteQuadric(kwadryka);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
switch (Key)
{
case 'W': PozycjaZ1 = PozycjaZ1 + 1.1; break;
}
RysujScene();
}
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez sebaskow » niedziela, 8 maja 2011, 18:55

No aby zaczęły się ze sobą zderzać, nie jest to takie proste.

Ja kontrolowałbym środek kuli, uwzględnił jej promień i gdy suma pronienia jednej z kul wraz z promieniem drugiej kuli zaczynają się pokrywać oznaczać to będzie zderzenie kul.

:)
Niestety nie ma gotowej funkcji do wykrywania kolizji, jedyne co możesz zrobić to określać położenie Sphery w przestrzeni 3D i gdy dwie figury zaczynają pokrywać tą samą przestrzeń możemy mówić o zderzeniu.

Natomiast, aby figury nie przechodziły przez siebie należy użyć ustawienia przed rysowaniem:

Kod: Zaznacz cały
glEnable(GL_DEPTH_TEST);


Wówczas OpenGl będzie testował bufor głębokości.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 19:11

ale dokładnie w którym miejscu glEnable(GL_DEPTH_TEST); trzeba wstawić bo wstawiam i dalej przechodzi
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 19:23

glEnable(GL_DEPTH_TEST); już działa tylko z tym zderzeniem jest problem bo faktycznie nie jest to proste.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez sebaskow » niedziela, 8 maja 2011, 19:42

Kolizji w OpenGL nie małem jeszcze okazji programować.

Musiałbym się zastanowić jak to napisać. Może wrócimy za kilka dni do tematu. Spróbuję coś fajnego wymyśleć.

Ważne jest aby wziąć pod uwagę kąt pod jakim się zderzają obiekty i siłę.

Coś w książkach poszukam. :)
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows XPFirefox

Re: Mój najważniejszy projekt

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 19:59

Dziękuję Ci, spróbuj to zrobić, jeżeli ja się czegoś nauczę to się odwdzięczę.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak animować obiekty w OpenGL?

Nowy postprzez Agnieszka16 » piątek, 13 maja 2011, 21:35

I jak Sebaskow? Udało Ci się coś? Ja mogę Cie nauczyć jak zrobić program do wysyłania emaili bo umiem go robić.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość