Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: Ammuksen tms. lentorata

Sivun loppuun

Antti Laaksonen [09.12.2002 12:55:15]

#

Tämä VB-ohjelma laskee ja piirtää ammuksen tai muun lentävän kappaleen lentoradan oikeaoppisilla fysiikan kaavoilla. Käytettävät yksiköt ovat tosin luonnosta poikkeavia (pikseliä/s jne.), mutta lentorata säilyy silti oikeanmallisena. Tämä koodi voi toimia perustana esimerkiksi klassiselle tykkipelille.

' Ammuksen lentorata on paraabeli, jonka x-arvo lasketaan kaavalla:
'     x = t * ut
' ja y-arvo lasketaan kaavalla:
'     y = u * t + 0.5 * a * t ^ 2
' kun:
'
' a = painovoimakiihtyvyys (m/s^2)
' t = aika (s)
' u = aloitusnopeus ylöspäin (m/s)
' xu = aloitusnopeus sivusuuntaan (m/s)
'
' Tässä ohjelmassa painovoimakiihtyvyys on kymmenes oikeasta ja mitat
' pikseleinä, jotta animaatio näkyy sopivassa suhteessa.

Private Sub Form_Activate()
    'piirtoasetukset
    ScaleMode = 3
    FillStyle = 0

    'muuttujamäärittelyt
    Dim t As Single, x As Single, y As Single
    Dim a As Single, u As Single, xa As Single
    Dim hid As Single

    'aloitusarvot
    u = 15
    a = -0.98
    xu = 10

    'kirjoitetaan tiedot ikkunaan
    Print "Kiihtyvyys: " & a & " pikseliä/s^2"
    Print "Aloitusnopeus (y): " & u & " pikseliä/s"
    Print "Aloitusnopeus (x): " & xu & " pikseliä/s"

    'käydään läpi 2 kymmenesosasekunnin välein tarvittaessa 500 sekuntiin
    For t = 0 To 500 Step 0.2
        'lasketaan x ja y kaavojen perusteella
        x = t * xu
        y = u * t + 0.5 * a * t ^ 2
        'jos ammus on takaisin maassa, poistutaan silmukasta
        If y < 0 Then Exit For
        'piirretään ammus
        ForeColor = 0
        FillColor = 0
        Circle (x, ScaleHeight - y), 5
        'pieni hidaste animaation aikaansaamiseksi
        hid = Timer
        Do While hid + 0.01 > Timer
            DoEvents
        Loop
        'pyyhitään ammus
        ForeColor = BackColor
        FillColor = BackColor
        Circle (x, ScaleHeight - y), 6
    Next
End Sub

KimmoKM [10.12.2002 18:18:15]

#

Minulle ei ole käyttöä kun ei ole VBtä enkä haluaisikkaan, mutta ideanhan siitä saa, tai siis kaavan millä sitä lasketaan.

snakari [10.12.2002 19:41:52]

#

toimii vb3llakin mutta kohtalaisen simppeli homma. olisit väsänny jonkun tuulen vielä vaikkei sitä oo vaikee väsätä ittekkään

Hipo [10.12.2002 20:14:44]

#

Jee, fysiikkaa. :) Alkukommentissa ut = xu ehkäpä? Nopeus on kyllä yleensä v (velocity), ei u. Meilläpäin nuo merkittäisiin ehkäpä näin:

x = v_x * t
y = v_y * t + 1/2 * a_y * t^2

Yleensä tietokonegrafiikassa kuitenkin hypitään pienissä askelissa (ja pienellä vääristyksellä), koska kappaleen nopeus ja kiihtyvyys vaihtuvat usein ja törmäystarkistus on huomattavasti helpompi. Eli joka framelle (p, v ja a vektoreita, deltatime on spf, seconds per frame):

v = v + a * deltatime
p = p + v * deltatime

eli jos a_x on taas nolla:

v_y = v_y + a_y * deltatime
p_x = p_x + v_x * deltatime
p_y = p_y + v_y * deltatime

Antti Laaksonen [10.12.2002 20:44:13]

#

Meidän kemiankirjassa u on aloitusnopeuden tunnus ja v loppunopeuden tunnus (esim. v = u + at). Mutta kirjaimet varmaan vaihtelee eri kirjoissa ja maissa, ei niillä niin väliä ole.

Arvelinkin että nopeutta vaativassa grafiikassa käytetään jotain tehokkaampaa laskentatapaa, mutta kyllä tuollakin tyylillä yksinkertaisen tykkipelin voi vääntää :)

kala [10.12.2002 23:35:14]

#

Tykkipeleissä on kyllä aina myös tuulen suunta ja nopeus, mutta noissa kaavoissa ei niitä ole.

progo [11.12.2002 16:30:20]

#

Eikä painoakaan oteta huomioon..

Antti Laaksonen [11.12.2002 17:10:19]

#

kala: Joo, onhan tuossa vielä senkin osalta kehitettävää...

proguru: Ei kappaleen paino lentorataa muuta, kappaleen lähtönopeus ja painovoimakiihtyvyys siihen lähinnä vaikuttavat.

Jamppa [11.12.2002 19:29:15]

#

Missä koulussa oot kun teillä tommosia on kemiankirjassa?

mikkot [11.12.2002 22:00:07]

#

liekö tarkoittanut fysiikankirjaa :P

mikkot [11.12.2002 22:01:05]

#

ja progurulle: tarkoititko painolla massaa?

Jamppa [11.12.2002 23:06:06]

#

mikkot: Niin kai...

Gevil [12.12.2002 18:29:45]

#

Tjaa että painovoimakiihtyvyys.. Tarkoittaakohan se samaa, kuin meilläpäin (normaali)putoamiskiihtyvyys, joka on suurinpiirtein 9,80665 m/s^2

Jamppa [13.12.2002 06:59:46]

#

Gevil: No sitä ihteään.kun usein kappaleen painoks(G=mg) sanotaa sellasta voimaa mikä on kumottava, että se pysyy paikallaan jossain kordinaatistossa. Ni siitä johtaa tuo painovoimakiihtyvyys.

uttumuttu [13.12.2002 14:18:51]

#

Todellinen välimerkkierotiikkakeskustelun helmi :) Nopeudesta muuteen käytetään monessakin yhteydessä kirjainta u. Esim. virtausdynamiikkaa käsittelevissä julkaisuissa joita olen lukenut käytetään yksinomaan merkintää u.

kaviaari [24.02.2003 08:56:45]

#

Tuulihan on helppo simuloida :
x=x+wind_speed
toi olis niiku itään painottava ja miinuksella ois länteen painottava

stere [28.01.2004 17:00:02]

#

Tarviiko tähän jonkunlaisen sivutilatuen vai onko ohjelma "Basic" tai "VisualBasic" tms.??

Ahti [16.11.2004 19:52:22]

#

ihan hyvä!
Tekisit sellasen et siinä voi valitä panoksen massan ja lähtönopeuden.

Timmmo [07.01.2013 00:23:37]

#

Hyvä esimerkki. Vieläkun tuohon saisi ilmanvastuksen mukaan, niin esimerkki olisi täydellinen. :)

User137 [24.01.2013 01:03:29]

#

Mun mielestä kannattaa mennä Hipo:n esimerkin mukaan. Ei mitään käyrä-kaavoja, vaan liikutetaan lentävää objektia vektoreilla (sijainti, liike, kiihtyvyys). Näin kappaletta voi lennättää vaikka samalla kun tuulen nopeus vaihtelee satunnaisesti.

Metabolix [24.01.2013 20:51:14]

#

Nämä kaavat eivät tietenkään sovi kovin hyvin reaaliaikaiseen peliin, mutta kyllä mielestäni vuoropohjaisissa peleissä (klassinen tykkipeli, Worms-kloonit ym.) voi hyvin käyttää tällaista lähestymistapaa.

Monesta suusta ehdotettu vektoriratkaisu on oikeastaan vain reaaliajassa laskettava numeerinen integraali, kun taas tässä integraalit on laskettu etukäteen.

Grez [26.07.2019 13:56:08]

#

lainaus:

laskee ja piirtää ammuksen tai muun lentävän kappaleen lentoradan oikeaoppisilla fysiikan kaavoilla.

Minusta esimerkiksi ammuksien kohdalla ei oikeastaan voi puhua "oikeaoppisista fysiikan kaavoista", kun todellisuudessa nopeilla kappaleilla ilmanvastuksella on hyvin merkittävä vaikutus. Esimerkiksi tykinkuulalla noin 100m/s nopeudessa ilmanvastus aiheuttaa yhtä suuren voiman kuin painovoima maan pinnan lähellä. Ja kun tykinkuulan laukaisunopeus on luokkaa 700m/s, niin ilmanvastuksen kasvaessa nopeuden toisessa potenssissa, on ilmanvastus aluksi luokkaa 50 kertaa suurempi kuin painovoiman aiheuttama voima.

Jossain koripallopelissä pallon lentoradan mallintamiseen kaavat voisi melkein toimia.. Koripallolla ilmanvastuksen ja painovoiman vaikutukset ovat saman suuruiset noin 20 m/s nopeudessa. Eli kyllä ainakin pitkissä heitoissa (suuri alkunopeus) alkaa ilmanvastuskin olla merkittävä.

(Ikivanha vinkki, mutta kun kerran oli nostona)


Sivun alkuun

Vastaus

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

Tietoa sivustosta