Fysiikkamallinnuksia

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Fysiikkamallinnuksia

Post by MaGetzUb »

Joo elikkä ajattelin taas perustaa tän tyyppisen ketjun, että sinne saisi foorumilaiset lähetellä omia fysiikka mallinnuksia toisten iloksi/huviksi/hyödyksi. Jollei tästä topikista ole ylläpitäjille haittaa, niin antakaa tulla vain koodejanne! Olisin kiitollinen nähdessäni 2 ulotteisen laatikon putoavan 2D mäkeä (janaa) pitkin alaspäin! :D
Last edited by MaGetzUb on Sun Apr 19, 2009 5:23 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Fysiikka mallinnuksia

Post by DatsuniG »

Örr..

Code: Select all

    FrameLimit 50
    Const Gravity = 0.08
    Const Bounce = -0.82
    angle = 0
    X# = 200
    Y# = 0
    GravityMultiPlier = 0
    Repeat
        If y < ScreenHeight() - 20 Then GravityMultiPlier + 1 Else GravityMultiPlier = GravityMultiplier * Bounce : Y = ScreenHeight() - 20
        If x<0 Or x>ScreenWidth() - 20 Or y<0 Or y > ScreenHeight() - 20 Then
            angle = 180 - angle
        EndIf
        Y = (Y + Gravity * GravityMultiplier) - Sin(angle) * 0.8
        X = x + Cos(angle) * 0.8
        Box x,y,20,20
        Text 2,2,FPS()
        DrawScreen
    Forever 
Hengität nyt manuaalisesti.
Tuxi
Active Member
Posts: 190
Joined: Wed Jan 21, 2009 10:25 pm
Contact:

Re: Fysiikka mallinnuksia

Post by Tuxi »

Laatikko jatkaa edestakaista liikettä vaikka pomppiminen on jo loppunut.
Projektit:
Jotain pientä (Ehkä vähän suurempaakin)

-Tuxi- (myös Tuxi4321)
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Fysiikka mallinnuksia

Post by DatsuniG »

Tuota on yritetty tehdä mahdollisimman pienellä rivimäärällä, joten...

Ja tässä on joku vanha kyhäelmä:

Code: Select all

FrameLimit 50

Const Gravity = 0.08
Const BOUNCE = -0.78

Ball = MakeImage(6,6)
Maa = MakeImage(400,300)

DrawToImage ball
    Circle 0,0,6,6
DrawToScreen

DrawToImage maa
    Ellipse 0,200,500,300
DrawToScreen 



x# = 200
y# = 10
angle = 45

Repeat
If MouseDown(1) Or MouseDown(2) Then
    DrawToImage maa
        If MouseDown(1) then Color cbblack Else Color cbwhite
        Circle MouseX()-20,MouseY()-20,40
    DrawToScreen
EndIf 

Color cbwhite 

GravityMultiplier = GravityMultiplier + 1

angle = WrapAngle(angle)

If GravityMultiplier <> 1 Then 
    y = (y + GRAVITY * GravityMultiplier) - Sin(angle)
    x = x + Cos(angle)
EndIf 

DrawImage maa,0,0
DrawImage Ball,x-3,y-3

For I = 1 To 1
    If GetColor(x,y+3) <> "0,0,0" Then GravityMultiplier = GravityMultiplier * BOUNCE : y - 1 : Exit
    If GetColor(x-3,y+3) <> "0,0,0" And angle <> 45 Then x + 1 : Angle = 45 : Exit
    If GetColor(x+3,y+3) <> "0,0,0" And angle <> 135 Then x - 1 : Angle = 135 : Exit
    
    If GetColor(x-2,y+3) <> "0,0,0" And angle <> 75 Then x + 1 : Angle = 45 : Exit
    If GetColor(x+2,y+3) <> "0,0,0" And angle <> 150 Then x - 1 : Angle = 135 : Exit
    
    If GetColor(x-3,y-3) <> "0,0,0" And angle <> 315 Then Angle = 315 : Exit
    If GetColor(x+3,y-3) <> "0,0,0" And angle <> 225 Then Angle = 225 : Exit 
Next i
    
If OutOfScreen(x,y) Then x = 200 : y = 0 : GravityMultiplier = 0 : Angle = 270   

DrawScreen

Forever 

Function GetColor(x,y)
    r = getRGB(1)
    g = getRGB(2)
    b = getRGB(3)
    PickColor x,y
    Return getRGB(RED)+","+getRGB(GREEN)+","+getRGB(BLUE)
    Color r,g,b
EndFunction 

Function OutOfScreen(x,y)
    If x<0 Or x>ScreenWidth() Or y>ScreenHeight() Or y<0 Then Return 1
EndFunction 
Hengität nyt manuaalisesti.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikka mallinnuksia

Post by MaGetzUb »

Äh, laatikolla on 8 törmäyspistettä ja pikselin tarkat törmäykset. :) Mutta tuota ei ole pakko ratkoa, lähettäkää omianne tekeleitänne älkääkä minun haaveita toteuttako. ;) Laatikko siis pyörii akselinsa ympäri tippuessaan..
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Fysiikka mallinnuksia

Post by axu »

programmer of DSG wrote:Äh, laatikolla on 8 törmäyspistettä ja pikselin tarkat törmäykset. :)
öö Mihinkä niitä törmäyspisteitä tarvitaan, jos on kerta pikselintarkka törmäys?
Fysiikan kokeisiin lukiessa kyhätty jousi(jotakin on pielessä, mutta mikä?):

Code: Select all

SCREEN 500,500

Dim VelX#,VelY#,x#,y#
Const MetPix=20
Const GRAV=9.80665
mass=20
sprC=30
sprL=100
Repeat
        //PIIRTELEMISET\\
    Color 255,255,255
    Spring(0,200,x,y,sprL/10,sprC)
    Box x-20,y,40,40
    Color 0,0,0
    Box x-18,y-2,36,36
    Color 255,255,255
    DrawToWorld ON, ON, ON
    CenterText x,y-20,mass+"kg",2
    
    
    ang#=GetAngle(0,200,x,y)
    x1#=Cos(ang#)*sprL
    y1#=-Sin(ang#)*sprL+200
    dis#=Distance(x1#,y1#,x,y)/MetPix
    ang#=GetAngle(x1#,y1#,x,y)
    VelX=VelX+(VelX*-.02 + Cos(ang#)* (-sprC*dis#) )/mass
    VelY=VelY+(VelY*-.02 + Sin(ang#)* ( sprC*dis#) -mass*GRAV)/mass
    ox=x:oy=y
    x=x+VelX/MetPix
    y=y+VelY/MetPix
        //KONTROLLIT\\
    If MouseDown(1) Then VelX=0:VelY=0:x=MouseWX():y=MouseWY()
    mass=mass+(KeyDown(cbKeyQ)-KeyDown(cbKeyA))
    sprC=sprC+(KeyDown(cbKeyW)-KeyDown(cbKeyS))
    sprL=sprL+(KeyDown(cbKeyE)-KeyDown(cbKeyD))
    
    DrawToWorld ON, ON, OFF
    Text 0, 0,"Siirrä hiirellä punnusta :)"
    Text 0,15,"FPS: "+FPS()

    Text 0,30,"massa(q/a): "+mass
    Text 0,40,"jousivakio(w/s): "+sprC
    Text 0,50,"jousen pituus(e/d): "+sprL
    DrawScreen
    
Forever

Function Spring(x1,y1,x2,y2,rounds,thickness#)
    dis#=Distance(x1,y1,x2,y2)/rounds
    dir#=GetAngle(x1,y1,x2,y2)
    xp#= Cos(dir#)
    xs#= Cos(dir#+90)
    yp#= Sin(dir#)
    ys#= Sin(dir#-90)
    Line x1,y1,x1+xp#+yp#*thickness, y1-yp#-ys#*thickness
    For i = 0 To rounds-2
        Line x1+xp#*i*dis#+yp#*thickness, y1-yp#*i*dis#-ys#*thickness, x1+xp#*(i+1)*dis#+xs#*thickness, y1-yp#*(i+1)*dis#-xp#*thickness
        Line x1+xp#*(i+1)*dis#+yp#*thickness, y1-yp#*(i+1)*dis#-ys#*thickness, x1+xp#*(i+1)*dis#+xs#*thickness, y1-yp#*(i+1)*dis#-xp#*thickness
    Next i
    Line x1+xp#*(rounds-1)*dis#+yp#*thickness, y1-yp#*(rounds-1)*dis#-ys#*thickness,x2,y2
EndFunction
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Fysiikka mallinnuksia

Post by koodaaja »

Itse olen tottunut tekemään pyörimättömän laatikon perusfysiikat näin, eli x- ja y-kiihtyvyyksiä muokkailemalla ja lisäämällä niitä koordinaatteihin ajan kulumisen verran.

Code: Select all

x# = 200:xvel# = 100.0
y# = 150:yvel# =-100.0
dt = Timer()

While 1
    f# = (Timer()-dt)/1000.0
    dt = Timer()
    
    yvel# = yvel# + .6
    x# = x# + xvel#*f#
    y# = y# + yvel#*f#
    
    If y#>290.0 Then
        yvel# = yvel#*-0.6
        y# = 580-y
        xvel# = xvel# * .8
    EndIf
    
    If x>390.0 Then
        xvel# = xvel# * -.8
        x# = 780-x
    ElseIf x<10.0 Then
        xvel# = xvel# * -.8
        x# = 20-x#
    EndIf
    
    Box x#-10, y#-10, 20, 20, 0
    
    DrawScreen
Wend
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikka mallinnuksia

Post by MaGetzUb »

koodaaja wrote:Itse olen tottunut tekemään pyörimättömän laatikon perusfysiikat näin, eli x- ja y-kiihtyvyyksiä muokkailemalla ja lisäämällä niitä koordinaatteihin ajan kulumisen verran.
Juu, mutta tarvitsenkin sellaista että laatikko tipahtaa mäkeen ja rupeaa vyöryämään (pyörimään akselinsa ympäri) mäkeä pitkin alaspäin. Tajuuko kukaan??
Attachments
Jos kuva selventäis?
Jos kuva selventäis?
Tällääne.PNG (7.01 KiB) Viewed 14819 times
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Fysiikka mallinnuksia

Post by axu »

Kyllähän tuon jo ihan ensimmäisen postisi perusteella pystyi tajuamaan, mutta toteutus on eri asia. Itse olen yrittänyt tuota useasti, mutta kappaleiden pyöriminen on perin haasteellinen asia fysiikassa(ainakin minulle :D ).
Monimutkaisin fysiikkamoottorini oli The Blobissa, koko peli lähtikin softbodyn fysiikan miettimisestä. Blobissa on 2 määräävää pistettä, toinen vasemmassa ylänurkassa ja toinen oikeassa alanurkassa. Törmäystarkistus tehtiin kahdeksasta pisteestä blobin ympäriltä ja sijoitettiin määräävät pisteet niiden mukaan, ja laskettiin uudet kiihtyvyydet kummallekin pisteelle.
blob.png
blob.png (58.2 KiB) Viewed 14789 times
Samaan tyyliin pitäisi onnistua pyöriteltävä laatikko, jossa on 4 määräävää pistettä ja törmäykset tehdään näistä pisteistä käsin. Sitten kun kaikki törmäykset on laskettu, jokaisella pisteellä on nyt uusi sijainti. Näiden sijaintien mukaan lasketaan vielä laatikon uusi paikka ja kulma+ päivitetään tämän mukaan kontrollipisteille uudet paikat. Saatoin puhua kyllä läpiä päähäni, mutta mielestäni tämän pitäisi onnistua. :D
laatikkofysiikka.png
laatikkofysiikka.png (4.27 KiB) Viewed 14792 times
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
m1c
Member
Posts: 65
Joined: Tue Aug 28, 2007 5:10 pm
Location: \o

Re: Fysiikka mallinnuksia

Post by m1c »

Joitakin avainsanoja: kulmakiihtyvyys, kulmanopeus, momentti, hitausmomentti. Katso vaikka wikipediasta. Oikeastaan pyörimisen lisääminen ei ole kovinkaan vaikeaa, on huomioitava aivan samat asiat kuin etenemisliikkeessä: Momentti vastaa voimaa, kulmakiihtyvyys kiihtyvyyttä, kulmanopeus nopeutta, hitausmomentti massaa. Laskukaavat ovat lähes samoja. Monimutkaisinta lienee voiman vaikutuspisteen ja törmäystarkistuksen tekeminen. Kulmittain olevien laatikoiden törmäystarkastus on monimutkaista, etenkin kun cb:ssä vektoreiden käsittely on melko .. hermojaraastavaa. :) Toisaalta pelkästä laatikosta ja viivoista koostuvan systeemin toteuttaminen on jo huomattavasti helpompaa.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikka mallinnuksia

Post by MaGetzUb »

Tarkoituksena oliskin pistää vähän koodiesimerkkiä, nimittäin itse en ole vielä kovin hyvä fysiikassa. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Fysiikka mallinnuksia

Post by SPuntte »

Voi teitä ihmiset, kun vaaditte niin vaikeita :geek:

Yritän säätää teille tuohon jotain esimerkkiä, mutta lupaan jo etukäteen, ettei se tule olemaan mitään ihan pullamössöä. Lisäksi tuskin jaksan panostaa sen rakenteeseen niin paljoa, että se olisi helposti muuhun konteekstiin siirrettävissä. Mutta ainakinpahan sitten näätte, mitä se on.. :twisted:

Tuo yhditelmä on fysiikkamallintajalle nimittäin jo listana ilmiöitä aika tappava:

Code: Select all

- etenemis- ja pyörimisliike
- painovoimakenttä
- törmäykset
    + liikemäärän säilymislaki, impulssiperiaate
    + impulssimomentin alias pyörimismäärän säilymislaki, impulssimomenttiperiaate
- liukuminen -> kitka
- lepokontakti (vrt. törmäys)
    + voiman ja vastavoiman laki
    + tasapainotila, voimaehto ja momenttiehto
Lisäksi matemaattisesti haastavia ongelmia ovat:
- törmäyksentunnistus
- liikeyhtäliden ratkaisu tarkasti mutta resurssitehokkaasti

Kun (joskus) saan nyrhittyä teille jotain kasaan, selitän sitten tarkemmin, mikä on ja miksi on monimutkaista toteuttaa.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Fysiikka mallinnuksia

Post by koodaaja »

programmer of DSG wrote:Juu, mutta tarvitsenkin sellaista että laatikko tipahtaa mäkeen ja rupeaa vyöryämään (pyörimään akselinsa ympäri) mäkeä pitkin alaspäin. Tajuuko kukaan??
En toki vihjannut mitenkään yrittäväni ratkaista ongelmaasi, kuten en tehnytkään, vaan esitin oman näkemykseni datsunin ohjelman tapaisesta.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikka mallinnuksia

Post by MaGetzUb »

SPuntte wrote:Voi teitä ihmiset, kun vaaditte niin vaikeita :geek:

Yritän säätää teille tuohon jotain esimerkkiä, mutta lupaan jo etukäteen, ettei se tule olemaan mitään ihan pullamössöä. Lisäksi tuskin jaksan panostaa sen rakenteeseen niin paljoa, että se olisi helposti muuhun konteekstiin siirrettävissä. Mutta ainakinpahan sitten näätte, mitä se on.. :twisted:

Tuo yhditelmä on fysiikkamallintajalle nimittäin jo listana ilmiöitä aika tappava:

Code: Select all

- etenemis- ja pyörimisliike
- painovoimakenttä
- törmäykset
    + liikemäärän säilymislaki, impulssiperiaate
    + impulssimomentin alias pyörimismäärän säilymislaki, impulssimomenttiperiaate
- liukuminen -> kitka
- lepokontakti (vrt. törmäys)
    + voiman ja vastavoiman laki
    + tasapainotila, voimaehto ja momenttiehto
Lisäksi matemaattisesti haastavia ongelmia ovat:
- törmäyksentunnistus
- liikeyhtäliden ratkaisu tarkasti mutta resurssitehokkaasti

Kun (joskus) saan nyrhittyä teille jotain kasaan, selitän sitten tarkemmin, mikä on ja miksi on monimutkaista toteuttaa.
Kiitos (tulevasta) avusta! :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Fysiikka mallinnuksia

Post by SPuntte »

Pahoittelen, olen tuon lupaamani esimerkin kanssa vähän vaiheessa. Ollut tässä viime päivinä jonkinasteista motivaation puutetta ja impulsiivisuutta havaittavissa, joten ei ole huvittanut uudelleenkirjoittaa hosuen huonosti suunniteltua törmäyksentarkistusalgoritmia, josta homma tällä hetkellä kiikastaa.

Nyt ei kuitenkaan uni maittanut, joten päätin säätää tällaisen ihan peruslelun, jossa on vaihteeksi pyörimisliikekin mukana. Ei siis mitään erityisen ihmeellistä, mutta jos kiinnostaa näin välipalana, vilkaise tänne.

Ohjelmakoodin ymmärtäminen vaatii kohtalaista tuntemusta peruskomennoista, funktioista ja tyypeistä. Vektorikirjastossa tyypit on korvattu muistipaloilla, joten ne tulee olla hallussa, jos mielii konepellin alle kurkistaa. Koodi on pääasiassa englanniksi, kommentit suomeksi. Ilmiöiden itsensä, eli syvällisempi ymmärtäminen edellyttää verrattain sujuvaa vektorimatematiikan hahmotusta ja fysiikan perustietoja etenemis- ja pyörimisliikkeestä. Myönnettäköön, että pyörimisen matemaattinen toteutus voisi olla helpompikin, mutta toteutin sen niin, kuinka se näissä yleensä tehdään, eli puhtaasti vektoreilla.

Tämä sepostus siksi, ettei tarvitse viiltää ranteita auki, jos koodi menee yli hilseen. Siinä ei ole mitään hävettävää - kaikki aikanaan. Nämä ovat oikeasti jo tällä tasolla aika vaativia juttuja :geek:
EDIT:

#1
Piti vielä sanomani, että niille, jotka ryntäävät suoraan painamaan F5:ä, voisi olla aika vitaali tieto, että leluun saa vipinää hiiren painikkeita räpläämällä..

EDIT:

#2
Niin ja tällaisena kielipoliisina en voi sietää tämän ketjun nimen yhdyssananvirhettä :evil:
JOKO Fysiikkamallinnuksia TAI Fysiikan mallinnuksia

CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikka mallinnuksia

Post by MaGetzUb »

Ihan hyvältä näytti, tosin miten tuota voisi hyödyntää muitten linjojen ja samanlaisten laatikoiden kanssa?
SPuntte wrote:
EDIT:

#1
Piti vielä sanomani, että niille, jotka ryntäävät suoraan painamaan F5:ä, voisi olla aika vitaali tieto, että leluun saa vipinää hiiren painikkeita räpläämällä..

EDIT:

#2
Niin ja tällaisena kielipoliisina en voi sietää tämän ketjun nimen yhdyssananvirhettä :evil:
JOKO Fysiikkamallinnuksia TAI Fysiikan mallinnuksia

No anteeks, jos pilasin elämäsi tuolla virheellä, mutta se on nyt sitten korjattu. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Fysiikka mallinnuksia

Post by SPuntte »

programmer of DSG wrote:Ihan hyvältä näytti, tosin miten tuota voisi hyödyntää muitten linjojen ja samanlaisten laatikoiden kanssa?
Vastaus: ei mitenkään sellaisenaan. Siitä puuttuu kokonaan törmäystarkistus ja törmäysten käsittely fysiikan kannalta. Lisäksi tuo Euler tuottaa kohtalaisesti virhettä, mistä johtuen hiiren ollessa lähellä kappaleen punaista homma ei toimi oikein.

Tarkoituksena olikin lähinnä demota voiman vaikutusta kappaleeseen pyöriminen mukaanlukien - kiinnittämättä suurempaa huomiota voiman syntyperään. Siitä johtuen esimerkiksi tuo tapa, jolla voiman suuruus määritellään (hiiren etäisyys punaisesta pisteestä kerrottuna jollain vakiolla) on täysin tuulesta temmattu, vaikkakin se muistuttaa ideaalisen jousen aiheuttamaa voimaa.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikkamallinnuksia

Post by MaGetzUb »

Sain, kuin sainkin tehtyä oman kuminauha virityksen, ilman mallista katsomatta. Vaikka olisi siihen ollut kyllä mahdollisuus. ;) Enkä katsonut SPuntelta mallia, jäi vain tuo "etäisyys kerrottuna jollain vakiolla" päähän soimaan..
Siinä:

Code: Select all


SCREEN 1024,768

mass# = 2
x# = MouseX()
y# = MouseY()

Repeat 



Text 0,15,"Kohteen massa: "+mass#+"kg"
Text 0,0,"Hallitse painoa ylä -ja alanuolella."

velx# = velx# + (MouseX()-x#)*0.05
vely# = vely# + (MouseY()-y#)*0.05

velx# = velx# + (-velx#)*0.05
vely# = vely# + (-vely#)*0.05

If KeyHit(200) Then mass# = mass# + 1
If KeyHit(208) Then mass# = mass# - 1
mass# = Max(1,mass#)

x# = x# + velx# / (mass*0.5)
y# = y# + vely# / (mass*0.5)

Line MouseX(),MouseY(),x#,y#
Circle x-(4+mass)/2,y-(4+mass)/2,4+mass,4

If x# < 0 Or x# > ScreenWidth() Then velx# = - velx#
If y# < 0 Or y# > ScreenHeight() Then vely# = - vely# 


DrawScreen Not MouseDown(1)
Forever 
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Fysiikkamallinnuksia

Post by MaGetzUb »

Joo nostaisin tämän topikin, kun tämä ei pitäisi olla tällaisia, jotka unohtuu vaan semmoinen, että sinne käyttäjät kokoaisivat tekemiään mallinnuksia. :(

Tässä teille heiluriesimerkki, yksinkertaistu Dream Physics Libarysta. :)

Code: Select all

SCREEN 800,600

Dim x#, y#, dx#, dy#, dist#, multiplier#, oldx#, oldy#, catch%, calculating%

SetFont LoadFont("Arie",15)

Gravity# = 0.3

x# = MouseX()-0.1
y# = MouseX()-99.9
maxdist# = 100
Repeat 
    ClearText 
    AddText "Hiiren rullasta pidentää heiluriväliä"
    AddText "Hiiren vasemmasta napista ottaa / vapauttaa heilurin"
    AddText "Välilyönnistä fysiikka mallinnus päälle / pois"
    dx# = (x - MouseX())
    dy# = (y - MouseY())
    maxdist# = maxdist# + MouseMoveZ()
    
    dist# = Sqrt(dx^2+dy^2)
    
    If MouseHit(1) Then catch = Not catch
    If catch = False Then 
        multiplier# = (dist# - maxdist#) / dist#
        x# = x# - dx*0.5*multiplier
        y# = y# - dy*0.5*multiplier
    EndIf 
    If KeyHit(57) Then calculating = Not calculating
    
    If calculating = True Then 
        tmpx# = x
        x = 2*x - oldx#
        oldx# = tmpx
        
        tmpy# = y
        y = 2*y - oldy# + Gravity#
        oldy# = tmpy
    EndIf 
    
    
    
    Circle x#-2.5,y#-2.5,5
    
    x# = Max(20,Min(x,780))
    y# = Max(20,Min(y,580))

DrawScreen
Forever 
Toivottavasti käyttäjät innostuisivat koodailemaan fysiikkamallinnuksia lisää. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Fysiikkamallinnuksia

Post by legend »

No tässä on sitten, squash pallo simulaatio kommenteja myöten =)

Code: Select all

   
    'By Legend
    
    SCREEN 400,300
    
    FrameLimit 60
    
    Dim i As Integer 'Väiliaikaisia muuttujia
    
    Dim PalloX As Integer, PalloY As Integer, PalloS As Byte 'mmuutujia
    Dim Painovoima As Float, Sivuvoima As Float
    
    Dim PainovoimanVoima As Float
    Dim Kimmoisuus As Float, Kimmoisuudenväri_R As Float
    
    Kimmoisuudenväri_R = 0
    
    Kimmoisuus = 2.325
    PalloS = 30
    PalloX = 200
    PalloY = 10
    Painovoima = 2
    Sivuvoima = -4
    PainovoimanVoima = 0.08
    
    ShowMouse OFF
    
    
    
    Repeat
        
        UpdateGame 'päivitettään peli...    
        
        If PalloY - Painovoima + PalloS/2 > 290 Or PalloY - Painovoima - PalloS/2 < 10 'Ala ja Ylä seinät
            Painovoima = (-Painovoima)/Kimmoisuus
            Painovoima = Painovoima - Painovoima * PainovoimanVoima
            PalloY = Min(Max(PalloY - Painovoima,10 + PalloS/2),290 - PalloS/2)
            
            If Painovoima > 1.5 Or Painovoima < -1.5
                Kimmoisuus = Max(Kimmoisuus - Painovoima/200,1.1)
            EndIf
            
        Else 'muuten
            If Painovoima > 0
                Painovoima = Painovoima - Painovoima * PainovoimanVoima
                If Painovoima < 1 Then Painovoima = -0.5
            Else
                Painovoima = Painovoima + Painovoima * PainovoimanVoima
            EndIf
            
            PalloY = Min(Max(PalloY - Painovoima,10 + PalloS/2),290 - PalloS/2)
        EndIf
        
        
        If  PalloX - Sivuvoima + PalloS/2 > 390 Or PalloX - Sivuvoima - PalloS/2 < 10 'VAsen ja Oikea
            Sivuvoima = (-Sivuvoima)/Kimmoisuus
            Sivuvoima = Sivuvoima - Sivuvoima * PainovoimanVoima
            PalloX = Min(Max(PalloX - Sivuvoima,10 + PalloS/2),390 - PalloS/2)
            
            If Sivuvoima > 1.5 Or Sivuovoima < -1.5
                Kimmoisuus = Max(Kimmoisuus - Sivuvoima/200,1.1)
            EndIf
            
        Else 'ja taas - muuten
            If Sivuvoima > 0
                Sivuvoima = Sivuvoima - Max(Sivuvoima * PainovoimanVoima/100,0.0085)
            Else
                Sivuvoima = Sivuvoima + Max(Abs(Sivuvoima) * PainovoimanVoima/100,0.0085)
            EndIf
            PalloX = Min(Max(PalloX - Sivuvoima,10 + PalloS/2),390 - PalloS/2)
        EndIf
        
        Kimmoisuus = Min(Max(Kimmoisuus + 0.002,1.1),2.325)
        Kimmoisuudenväri_R = (2.325 - Kimmoisuus) * 200
        
        
        'Text 0,0, Sivuvoima + " " + Painovoima
        'Text 0,20, Sivuvoima * PainovoimanVoima + ""
        'Text 0,40, Kimmoisuudenväri_R + " " + Kimmoisuus
        
        
        For i=1 To 10
            Color Int(Kimmoisuudenväri_R),40 + i*2, 40 + i*2 'oikean värisenä
            Circle PalloX-(PalloS - i*2)/2, PalloY-(PalloS - i*2)/2, PalloS - i*2 'pallo
        Next i
        
        
        Color 255,150,10
        Line 0,290,400,290 'ala
        Line 0,10,400,10 'ylä
        Line 10,0,10,300 'vasen
        Line 390,0,390,300 'oikea
        
        If (MouseX()< 190 Or MouseX()> 210) Or (MouseY() < 140 Or MouseY() > 160) 'joshhirtä on liikutettu
            Sivuvoima = Sivuvoima - MouseMoveX()/10
            Painovoima = Painovoima - MouseMoveY()/10
            PalloY = PalloY - Sivuvoima
            PositionMouse 200, 150 'laitettaan hiiri oikeaan paikkaan
            i = MouseMoveX() 'päivitettään liikutus...
            i = MouseMoveY()
            
        Else
            PositionMouse 200, 150 'laitettaan hiiri oikeaan paikkaan
            i = MouseMoveX() 'päivitettään liikutus...
            i = MouseMoveY()
        EndIf
        
        DrawScreen
        
        
    Forever
    
    
Post Reply