Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Törmäys kohteeseen

Sivun loppuun

mika132 [28.05.2011 21:01:23]

#

Anteeksi nyt että täytän taas tätä keskustelualuetta.

Eli olen tässä nyt pähkäillyt ja raapinut päätä ja lueskellut mutta tuo kahden auton törmäys ei onnistu.

Miten voidaan laskea, että kumpi törmääjistä on edellä? Eli kumman vauhti pysää törmäyksen johdosta ja kumpi saa sitä hieman lisää.

Miten voidaan laskea että jos törmäys osuukin sivuosaan?

koko hommaahan vaikeuttaa vielä se, että autot pyörivät. Eli miten saan koko systeemin vielä muutettua niin että se laskee koko ajan auton asennon ja katsoo missä on perä ja missä keula ja missä kylki.

Metabolix [28.05.2011 21:11:52]

#

Eikö tämä ole jo aika monta kertaa käyty läpi? Kun sinulle tuo matematiikan opettelu on näköjään jollain tavalla ylivoimaista, voisi olla kätevintä vain ottaa jokin valmis fysiikkamoottori.

mika132 [28.05.2011 22:27:50]

#

En halua käyttää valmiita fysiikka moottoreita vaan oppia.

Luin matematiikka oppaan osan kaksi ja kolme.

Peiliheijastusta voi käyttää siis autojen keskenään törmäyksessä, mutta se jäi epäselväksi, että mitä muuta tarvitsen? Pistetuloja? Vai mitä ihmettä? =)

kayttaja-2499 [28.05.2011 23:30:25]

#

http://www02.oph.fi/etalukio/opiskelumodulit/fysiikka/fysiikka/
http://www02.oph.fi/etalukio/opiskelumodulit/fysiikka/mekaniikka/index.html

mika132 [01.06.2011 01:48:54]

#

Noniin.. fysiikan perusteita luettu ja sain seuraavan kaavan aikaiseksi:

float Game::LaskeTormays(float x, float y, float x_ai2, float y_ai2, float x2, float y2, int massa, int massa2, float vauhti, float vauhti2, double kulma, double kulma2) {
    float x_speed = x_oma - x;
    float y_speed = y_oma - y;
    float x_speed2 = x_ai2 - x2;
    float y_speed2 = y_ai2 - y2;

    float eka_lasku = (x_speed * massa) + (x_speed2 * massa2);
    float lasku_kaksi = massa + massa2;
    float tulos = eka_lasku / lasku_kaksi;
    return tulos;
}

//ja sitten se hakeminen:
                float muutos = LaskeTormays(vanha_x, vanha_y, vanha_x_ai2, vanha_y_ai2, kisaa->x, kisaa->y, 600, 600, nopeus_oma, kisaa->nopeus, kulma_oma, kisaa->kulma);
                x_oma -= muutos;

Tällä hetkellä vaihtuu ainoastaan x akseli koska en tiedä miten laskisin y akselin tuohon mukaan jotta auto ei törmäyksen hetkellä menisi neliömäisesti.

Törmäys tuntuisi toimivan jopa x akselissa tuolla kaavalla.. törmäily on vain hieman "nykivää" auto lentää kauhean pitkälle taakseppäin törmätessä toiseen autoon kun taas toinen auto ei oikeastaan edes liikahda.

Teuro [01.06.2011 06:52:16]

#

Törmäystä tutkivan funktion ei tulisi laskea nopeuksia, vaan sen tulisi laskea ainoastaan osuuko kaksi objektia toisiinsa vai ei. Palautusarvon tyypin tulisi olla ihan vain bool. Funktion prototyyppi voisi olla tällainen:

bool Game::check_collision(const Game::car& car_1, const Game:car& car_2);

Funktion saa siis kaksi Game::car tyyppistä viitettä, joita se ei muuta mitenkään. Olioihin on tallennettu kunkin auton tiedot nopeudet, massat jne.

Nopeudet ja vastaavat ovat ihan toisessa osassa koodia. Ne tulisi olla funktioissa, jotka laskevat uutta paikkaa autolle. Muutoinkin tuon funktion kutsu näyttää aika sekavalta, koska erilaisia x ja y arvoja on siellä melko paljon. Pysytkö itse mukana noissa muuttujissa?

jalski [01.06.2011 07:52:12]

#

mika132: Jos haluat laskea törmäys vasteita kappaleiden välillä, saada ne pyörimään ja käyttäytymään edes hitusen realistisesti, joudut kyllä opiskelemaan paljon enemmän fysiikkaa ja matematiikkaa.

Matematiikan puolelta ainakin näihin asioihin joudut tutustumaan:

- integrointi
- derivointi
- differentiaali yhtälöt
- numeerinen integrointi (ODE, eulerin metodi vähintään)

Game Developer Magazine:ssa julkaistiin aikoinaan perusteista lähtevä Chris Hecker:in artikkelisarja Rigid Body Dynamics.

Löytyypi ainakin täältä

Metabolix [01.06.2011 11:57:45]

#

jalskin mainitsemat asiat tulevat siellä opettelulistan loppupäässä, nyt alkuun olisi kriittisempää opiskella analyyttista geometriaa ja vektorilaskuja. Lainaa kirjastosta vaikka lukion pitkän matematiikan kirjat mainituista aiheista. Jos et osaa kirjojen tehtäviä, et osaa tehdä tätä törmäystarkistustakaan; kirjoissa tehtävät ovat helppoja ja suoraviivaisia, tosielämässä laskut ovat useampivaiheisia ja ne pitää itse ensin keksiä.

Sanoit, että haluat oppia. Ota sitten kirja käteen ja paina takapuoli penkkiin. Jos opettelu kirjasta ei suju, kannattaa ehkä hakeutua johonkin oikeaan oppilaitokseen (esim. iltalukioon), ellei halua peräti palkata yksityisopettajaa.

mika132 [01.06.2011 12:47:36]

#

Pelini takaraja lähestyy ja tarkoitus on realisoida fysiikoita vasta seuraavassa osassa.

Tällä hetkellä törmäykseeni riittäisi ainoastaan se että auto mikä törmää hidastuu (jonka jo osasin tehdä) ja auto johon törmätään saa hieman lisää vauhtia samaan suuntaan kun törmääjä oli menossa. Auton ei tarvitse pyörähtää törmäykseastä eikä muuta.. kuhan sillä olisi edes jokin vaikutus.

Noiden fysiikoiden opiskeluun niin että ymmärtää menee kuukausia joten mieluusti tekisin ne seuraavaan osaan.. eli osaatteko auttaa tämän helpomman törmäyksen kanssa? :D

Metabolix [01.06.2011 12:59:54]

#

Helpompaan törmäykseen olen jo muistaakseni ainakin pari–kolme kertaa neuvonut, että laske vain Pythagoraan lauseella autojen välinen matka. Törmääjän saat helposti selville niin, että teet tarkistuksen jo auton siirtämisen yhteydessä, jolloin törmäävä auto mitä ilmeisimmin on juuri se, jota yrität siirtää.

mika132 [01.06.2011 13:55:54]

#

Nyt lasken pythagooralla tuon törmäys jutun ja vähän vitirrelin ja näyttää hyvältä..

Ainut ongelma että jos törmäys tulee alhaalta päin verrattuna törmättävään autoon niin törmättävä auto lentää alaspäin oman auton ylitse.

Eli miten voisi tuon vielä tarkistaa, että mistäpäin törmäys on tulossa?

Metabolix [01.06.2011 14:10:32]

#

No sinullahan on ne autojen sijainnit. Jos auto A on auton B vasemmalla puolella, aika vaikea sen on varmaan oikealtakaan törmätä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta