Fysiikkamallinnuksia
Fysiikkamallinnuksia
Re: Fysiikka mallinnuksia
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
Re: Fysiikka mallinnuksia
Jotain pientä (Ehkä vähän suurempaakin)
-Tuxi- (myös Tuxi4321)
Re: Fysiikka mallinnuksia
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
Re: Fysiikka mallinnuksia
Re: Fysiikka mallinnuksia
öö Mihinkä niitä törmäyspisteitä tarvitaan, jos on kerta pikselintarkka törmäys?programmer of DSG wrote:Äh, laatikolla on 8 törmäyspistettä ja pikselin tarkat törmäykset.
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
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Fysiikka mallinnuksia
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
Re: Fysiikka mallinnuksia
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??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.
- Attachments
-
- Jos kuva selventäis?
- Tällääne.PNG (7.01 KiB) Viewed 14819 times
Re: Fysiikka mallinnuksia
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. 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.
Re: Fysiikka mallinnuksia
Re: Fysiikka mallinnuksia
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: Fysiikka mallinnuksia
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..
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
- 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.
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Fysiikka mallinnuksia
En toki vihjannut mitenkään yrittäväni ratkaista ongelmaasi, kuten en tehnytkään, vaan esitin oman näkemykseni datsunin ohjelman tapaisesta.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??
Re: Fysiikka mallinnuksia
Kiitos (tulevasta) avusta!SPuntte wrote:Voi teitä ihmiset, kun vaaditte niin vaikeita
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..
Tuo yhditelmä on fysiikkamallintajalle nimittäin jo listana ilmiöitä aika tappava:Lisäksi matemaattisesti haastavia ongelmia ovat: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
- 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.
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: Fysiikka mallinnuksia
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
#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ä..
#2
Niin ja tällaisena kielipoliisina en voi sietää tämän ketjun nimen yhdyssananvirhettä
JOKO Fysiikkamallinnuksia TAI Fysiikan mallinnuksia
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Re: Fysiikka mallinnuksia
No anteeks, jos pilasin elämäsi tuolla virheellä, mutta se on nyt sitten korjattu.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ä
JOKO Fysiikkamallinnuksia TAI Fysiikan mallinnuksia
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: Fysiikka mallinnuksia
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.programmer of DSG wrote:Ihan hyvältä näytti, tosin miten tuota voisi hyödyntää muitten linjojen ja samanlaisten laatikoiden kanssa?
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.
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Re: Fysiikkamallinnuksia
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
Re: Fysiikkamallinnuksia
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
Re: Fysiikkamallinnuksia
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