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
Minulle ei ole käyttöä kun ei ole VBtä enkä haluaisikkaan, mutta ideanhan siitä saa, tai siis kaavan millä sitä lasketaan.
toimii vb3llakin mutta kohtalaisen simppeli homma. olisit väsänny jonkun tuulen vielä vaikkei sitä oo vaikee väsätä ittekkään
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
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ää :)
Tykkipeleissä on kyllä aina myös tuulen suunta ja nopeus, mutta noissa kaavoissa ei niitä ole.
Eikä painoakaan oteta huomioon..
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.
Missä koulussa oot kun teillä tommosia on kemiankirjassa?
liekö tarkoittanut fysiikankirjaa :P
ja progurulle: tarkoititko painolla massaa?
mikkot: Niin kai...
Tjaa että painovoimakiihtyvyys.. Tarkoittaakohan se samaa, kuin meilläpäin (normaali)putoamiskiihtyvyys, joka on suurinpiirtein 9,80665 m/s^2
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.
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.
Tuulihan on helppo simuloida :
x=x+wind_speed
toi olis niiku itään painottava ja miinuksella ois länteen painottava
Tarviiko tähän jonkunlaisen sivutilatuen vai onko ohjelma "Basic" tai "VisualBasic" tms.??
ihan hyvä!
Tekisit sellasen et siinä voi valitä panoksen massan ja lähtönopeuden.
Hyvä esimerkki. Vieläkun tuohon saisi ilmanvastuksen mukaan, niin esimerkki olisi täydellinen. :)
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.
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.
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)
Aihe on jo aika vanha, joten et voi enää vastata siihen.