|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
11.3.2012, 20:02 | #1 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
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; } Ako neko vidi gde gresim, ili ima na umu neku drugo resenje neka kaze? |
11.3.2012, 20:40 | #2 |
Starosedelac
|
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 |
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci: | ||
Belphegor (11.3.2012) |
11.3.2012, 20:50 | #3 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
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. |
11.3.2012, 20:57 | #5 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
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) |
12.3.2012, 0:26 | #6 |
Ad Ministrator
Član od: 19.8.2005.
Lokacija: Beograd, SK
Poruke: 7.280
Zahvalnice: 29
Zahvaljeno 3.041 puta na 1.544 poruka
|
Re: Box2D, vektor refleksije...
A da nije možda još i koren iz tog zbira kvadrata?
|
12.3.2012, 0:30 | #7 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: Box2D, vektor refleksije...
Jeste ide i koren, ali nisam upisao u post.
|
12.3.2012, 0:41 | #8 | |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: Box2D, vektor refleksije...
Citat:
|
|
12.3.2012, 9:25 | #9 |
Starosedelac
|
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š...
|
Bookmarks sajtovi |
|
|