Keresés

Aktív témák

  • BaLinux

    tag

    válasz [Kovi] #25 üzenetére

    Ejj, hát kipróbáltad már végre, vagy feleslegesen gépeltem ennyit? ;]

  • BaLinux

    tag

    válasz [Kovi] #20 üzenetére

    Hát mondjuk ha csak kettő labdád van, akkor:
    ütköznek <==> (labda1.x-labda2.x)^2+(labda1.y-labda2.y)^2 <= (labda1.r+labda2.r)^2

    az ütközés kimenetele pedig a fenti egyenlőtlenség teljesülése esetén így számolható:
    - van a két labda, L1 és L2, és ismertek a koordinátáik: (.x; .y)=P, sebességkomponenseik: (.vx; .vy)=V, és sugaruk: .r.

    Az ütközési normálvektor: N=(L1.P-L2.P)/abs(L1.P-L2.P) (tehát normalizálom, 1 hosszú vektor az N, és az egyik kör közepébe mutat, -N meg a másik közepébe)
    Ezután transzformálod a két sebességvektort az N-nel párhuzamos és merőleges komponenssű vektorrá:
    L.V_N=(N.x*L.V.x+N.y*L.V.y ; -N.y*L.V.x+N.x*L.V.y)
    (mindkettőre igaz) => az L1.V_N és L2.V_N vektorok ''x'' összetevője tehát most a normális irányú sebességük, ''y'' összetevője meg az erre merőleges sebességük.
    Az egészet azért csináltuk, mert csak az ún. centrális sebességük változik az ütközéskör.
    Fgv. táblázatból:
    L1.U_N.x=((1+k)*(L1.m*L1.V_N.x + L2.m*L2.V_N.x)/(L1.m+L2.m) - k*L1.V_N)
    L2.U_N.x=((1+k)*(L1.m*L1.V_N.x + L2.m*L2.V_N.x)/(L1.m+L2.m) - k*L2.V_N)
    illetve
    L1.U_N.y=L1.V_N.y
    L2.U_N.y=L2.V_N.y
    (ez maradt meg)
    ,
    ahol az U_N vektor az új, ütközés utáni sebességvektor. Ja, itt van egy Lx.m, ami a tömegük (tőlem lehet 1 is...), k pedig az ütközési rugalmasság. (tőlem legyen 1)
    Ezt most nyilván visszafelé is transzformálni kell a ''normál'' koorinátarendszerbe, tehát

    L.U=(N.x*L.U_N.x-N.y*L.U_N.y ; N.y*L.U_N.x+N.x*L.U_N.y)

    mindkét labdára.
    Így a végső sebességeik tehát L1.U, L2.U.

    Remélem érthető és nem b*sztam el valahol egy előjelet. :DD
    (ezt a progim általánosabb függvényének spec paraméterezése)

    [Szerkesztve]

  • BaLinux

    tag

    válasz [Kovi] #17 üzenetére

    Javaslom a #16-os hozzászólás áttanulmányozását! :)

  • BaLinux

    tag

    válasz [Kovi] #15 üzenetére

    De jó látni hogy van még rajtam kívül ember aki az ilyen szimulációkat szereti :)

    A több labdás probléma már egy komoly dolog. Tavaly írtam egy 2d-s fizikai szimulátort c++-ban, ami támogatja a kör és poligon (konkáv is!) alapú ütközést. Egy lassan készülő kis játék fizikai motorja lesz amúgy. 2-3 hétig agyaltam rajta szüntelenül, összesen 77k kód.
    A kör alapú, ami neked kell, még nem olyan bonyi, mert egyszerűen meghatározható minden labda-párra az az idő, amikor a jövőben adott aktuális sebességükkel ütközni fognak. A poligonos viszont már bonyolult, és pontatlan is, de azért működik.
    Az ütközés számításához kell egy kis fizika (pl. én figyelembe veszem a tömeget, tehetetlenségi nyomatékot és rugalmasságot is).
    Az ütközés csak abból áll, hogy az abban résztvevő objektumok sebessége megváltozik az adott összefüggések alapján.
    A #13 hozzászólást intéző kollega által javasolt módszerrel kellene továbbvinni a programod, mert a tiéd a cos/sin miatt lassú, viszont közel ugyanolyan pontatlan, tehát nem sok előnye van.
    Ha érdekel, szívesen segítek.

Aktív témák

Hirdetés