Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 11.3.2012, 20:02   #1
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Box2D, vektor refleksije...

Za one koji ne znaju, pravim klon stare igre Breakout. Posto koristim Box2D za fiziku, koje bas i nije dizajniran za ovakvu stvar, imam problem.

Po nekoj normalnoj logici kako fizika funkcionise, vektor "refleksije" kad loptica udari u "tablu" koju kontrolise igrac, izgleda otprilike ovako:



Da ne objasnjavam sliku, verujem da je logicna.

Medjutim kod ovakve igre to nije slucaj, taj vektor "refleksije" zavisi sa koje "polovine strane" je loptica udarila tablu, pa s'tim moram da je polu-rucno i kontrolisem:

Kod:
// Kad loptica napravi kontakt sa "tablom"
float padd_half_sz = (player_sprite->getSize().x * 0.5f) / B2_PIXEL_RATIO;    // polovina "table", skalirano u Bo2D jedinicama
float ball_pos     = (*balls_it)->getBody()->GetPosition().x;                 // X pozicija Box2D "tela" trenutne loptice
float padd_pos     = player_sprite->getBody()->GetPosition().x + padd_half_sz;// X pozicija polovine table
float x            = ball_pos - padd_pos;                                     // razlika od centra table
bool sign          = x < 0.0f;                                                // da sacuvam "znak" razlike
x                  = proportion(std::fabs(x), padd_half_sz, 1.0f);            // razlika propocionalno 0 - 1
b2Vec2 vel = b2Vec2(sign ? -x : x, -(1.0f - std::fabs(x)));        // Y samo u minus, a '1 - fabs(x)' da bih imao "unit vektor"
vel *= ball_speed;                                                 // da bi sa '*= ball_speed' imao brzinu koju mogu da kontrolisem
(*balls_it)->getBody()->SetLinearVelocity(vel);                    // dodeli vektor

...
template< typename T >
T proportion(T oldNum, T oldSz, T newSz)
{
    oldNum *= newSz;
    oldNum /= oldSz;
    return oldNum;
}
Medjutim kad je ugao veliki, cini mi se da loptica ide mnogo sporije nego kad je recimo ravno na gore V(0, -1).
Ako neko vidi gde gresim, ili ima na umu neku drugo resenje neka kaze?
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 11.3.2012, 20:40   #2
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom Re: Box2D, vektor refleksije...

Generalno bi trebalo da ti Velocity bude oblika Direction * Speed.

U tvom slučaju, izračunaj vektor smera kako želiš, normalizuj ga (svaka komponenta posebno / length , mada pretpostavljam da b2Vec vec ima normalize() [edit: proverio, ima]), i pomnoži sa brzinom.

Reference za kasnije, ako zatreba:

Kod:
Reflect: v = i - 2 * n * dot(i•n)
i je ulazni vektor, n je normala.

Normalize: v = v / length(v)

Poslednja ispravka: MG-RAY (11.3.2012 u 20:50) Razlog: Primeri
MG-RAY je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci:
Belphegor (11.3.2012)
Stara 11.3.2012, 20:50   #3
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Box2D, vektor refleksije...

Ali ako je vektor "unit vektor" onda nema potrebe za normalizacijom?
Sad sam samo dodao normalize odmah pre SetLinearVelocity za sad izgleda ok.
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 11.3.2012, 20:55   #4
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom Re: Box2D, vektor refleksije...

Unit vektor je vektor dužine jedan (1)...

Možda ti je matematika bila pogrešna...?
MG-RAY je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci:
Belphegor (11.3.2012)
Stara 11.3.2012, 20:57   #5
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Box2D, vektor refleksije...

EDIT: Izgleda da sam permutovao, duzina vektora nije abs(x) + abs(y) nego x*x + y*y
u tome mi je i greska.

Poslednja ispravka: Belphegor (11.3.2012 u 21:08)
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 12.3.2012, 0:26   #6
VojaM
Ad Ministrator
 
Avatar korisnika VojaM
 
Član od: 19.8.2005.
Lokacija: Beograd, SK
Poruke: 7.280
Zahvalnice: 29
Zahvaljeno 3.041 puta na 1.544 poruka
Određen forumom Re: Box2D, vektor refleksije...

A da nije možda još i koren iz tog zbira kvadrata?
VojaM je offline   Odgovor sa citatom ove poruke
Stara 12.3.2012, 0:30   #7
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Box2D, vektor refleksije...

Jeste ide i koren, ali nisam upisao u post.
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 12.3.2012, 0:41   #8
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Box2D, vektor refleksije...

Citat:
MG-RAY kaže: Pregled poruke

Reference za kasnije, ako zatreba:

Kod:
Reflect: v = i - 2 * n * dot(i•n)
i je ulazni vektor, n je normala.

Normalize: v = v / length(v)
Super sto si stavio kod ali ovo je za vektor refleksije, samo sto sam ja napisao u mom prvom postu da kod Breakout-a ovo ne vazi kad loptica udari u "tablu" vec zavisi sa koje strane "sredine" je udarila.

Belphegor je offline   Odgovor sa citatom ove poruke
Stara 12.3.2012, 9:25   #9
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom Re: Box2D, vektor refleksije...

^ Razume se, ostavio sam to za slucaj da ti mozda zatreba za nešto... I ja sam pravio sličnu igru pre par godina kao projekat za fax, tako da znam sa čime se suočavaš...
MG-RAY je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 20:14.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com