Dream Physics Engine

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Post Reply
User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Dream Physics Engine

Post by MaGetzUb » Sat Oct 24, 2009 7:58 pm

Olenkin jo jonkin aikaa haaveillut kunnon fysiikoista CB:lä. Ainoa ongelma olikin, miten aloittaa. No päädyinpä kysymään Spuntelta apua. :) Pari kertaa kyllästyinkin, mutta nyt olen saanut jotain aikaan.
Kirjasto on nyt jaossa. Kertokaa bugeista minulle, ja jos en vastaa niin voittehan yrittää itse korjailla niitä.

Kommentoikaa ja kertokaa ohjelman pyörimis nopeudet! :D
Btw, kiitos vaan avusta SPuntelle!

Tulevat lisäominaisuudet:
- DrawImagePar() - Piirtää kuvan partikkelin siainteihin
- ParticleImageCollision() - Käyttää kuvaa pikselin tarkasti törmäyspintana
- SetParDist:n lisäys: Pitää partikkelia sovittujen kulmien välillä toiseen partikkeliin nähden. Tämä päivitys ei tule ihan heti, minun pitää ottaa selvää, miten tämä toimii.
- VectorIntersect() - Kertoo onko kaksi partikkeliviivaa päällekkäin.


Nyt uudet ominaisuudet:
DeleteParticle() ja FormateParticles() ;)

Tässäpä olisi toinen räsynukke, mutta selkärangassakin on piste. :)

Code: Select all

Include "Dream Physics Libary.CB"


SCREEN 1280,720
SetWindow "Dream Physics Ragdoll"

//Luodaan partikkelien hallinta taulukko
Dim Particles_(14)


//Tehdään 11 partikkeli handlea
For i = 0 To 14
Particles_(i) = AddParticle(1920/2,1080/2)
Next i


gravity# = 0.3
wind# = 0.0
MouseHold = True
Repeat 


    If MouseHit(1) Then MouseHold = Not MouseHold 
    If MouseHold = True Then SetParPosition(Particles_(pointing),MouseX(),MouseY()) 
    
    ParticlesAbsoluteArea(0,0,ScreenWidth(),ScreenHeight()-20)
    
    
    'Selkäranka
    SetParDist(Particles_(0),Particles_(1),22)
    SetParDist(Particles_(1),Particles_(2),22)
    SetParDist(Particles_(2),Particles_(3),22)
    'Kädet
    SetParDist(Particles_(0),Particles_(4),50)
    SetParDist(Particles_(0),Particles_(5),50)
    
    SetParDist(Particles_(4),Particles_(6),50)
    SetParDist(Particles_(5),Particles_(7),50)
    
    'Jalat
    SetParDist(Particles_(3),Particles_(8),45)
    SetParDist(Particles_(3),Particles_(9),45)
    
    SetParDist(Particles_(8),Particles_(10),55)
    SetParDist(Particles_(9),Particles_(11),55)
        
        
        
    DrawVector(Particles_(0),Particles_(1))
    DrawVector(Particles_(1),Particles_(2))
    DrawVector(Particles_(2),Particles_(3))
    'Kädet
    DrawVector(Particles_(0),Particles_(4))
    DrawVector(Particles_(0),Particles_(5))
    
    DrawVector(Particles_(4),Particles_(6))
    DrawVector(Particles_(5),Particles_(7))
    
    'Jalat
    DrawVector(Particles_(3),Particles_(8))
    DrawVector(Particles_(3),Particles_(9))
    
    DrawVector(Particles_(8),Particles_(10))
    DrawVector(Particles_(9),Particles_(11))
    
    If KeyHit(cbkeyup) Then 
        gravity# = gravity# - 0.01
    ElseIf KeyHit(cbkeydown) Then 
        gravity# = gravity# + 0.01
    EndIf 
    
    If KeyHit(cbkeyright) Then 
        wind# = wind# - 0.01
    ElseIf KeyHit(cbkeyleft) Then 
        wind# = wind# + 0.01
    EndIf 
    
    Vecta = GetVectorAngle(Particles_(1),Particles_(0))
    Circle GetParx(Particles_(0))-10+Cos(Vecta)*10,GetParY(Particles_(0))-10-Sin(Vecta)*10,20
    CalculateParPositions(wind# ,gravity#)

    
    
    Text 0,0,"Horizion velocity (x axel constforce): "+wind
    Text 0,15,"Gravity (y axel constforce): "+gravity#
    Text 0,30,"Use arrows To change values."
    Text 0,45,"Togle mouse left button To set ragdoll free Or catch it back."
    Text 0,60,"FPS: "+FPS()
DrawScreen
Forever 
Tässäpä vielä esimerkki köydestä:

Code: Select all

Include "Dream Physics Libary.CB"


SCREEN 1280,720
SetWindow "Dream Physics Ragdoll"

//Luodaan partikkelien hallinta taulukko
Const MaxParticles = 20
Dim Particles_(MaxParticles)


//Tehdään 11 partikkeli handlea
For i = 0 To MaxParticles
Particles_(i) = AddParticle(1920/2,1080/2)
Next i


gravity# = 0.3
wind# = 0.0
MouseHold = True
pointing = 0
Repeat 



    
   
    For i = 1 To MaxParticles
    SetParDist(Particles_(i-1),Particles_(i),20)
    Next i

    pointing = pointing + MouseMoveZ()
    pointing = Max(0,Min(pointing,MaxParticles))
    
    If MouseHit(1) Then MouseHold = Not MouseHold 
    If MouseHold = True Then SetParPosition(Particles_(pointing),MouseX(),MouseY()) 
    
    
    CalculateParPositions(wind# ,gravity#)
    
    For i = 0 To MaxParticles
        DrawVector(Particles_(0),Particles_(1))
        If i > 1 Then 
            DrawVector(Particles_(i-1),Particles_(i))
        EndIf 
    Next i
    
    
    
    If KeyHit(cbkeyup) Then 
        gravity# = gravity# - 0.01
    ElseIf KeyHit(cbkeydown) Then 
        gravity# = gravity# + 0.01
    EndIf 
    
    If KeyHit(cbkeyright) Then 
        wind# = wind# - 0.01
    ElseIf KeyHit(cbkeyleft) Then 
        wind# = wind# + 0.01
    EndIf 
    
   
    ParticlesAbsoluteArea(0,0,ScreenWidth(),ScreenHeight()-30)    
    

    
    
    Text 0,0,"Horizion velocity (x axel constforce): "+wind
    Text 0,15,"Gravity (y axel constforce): "+gravity#
    Text 0,30,"Use arrows To change values."
    Text 0,45,"Togle mouse left button To set rope free Or catch it back."
    Text 0,60,"FPS: "+FPS()
    Text 0,75,"Use mouse scroll to change controlling point."
DrawScreen
Forever 
Attachments
Dream Physics Libary.zip
(45.13 KiB) Downloaded 150 times
Last edited by MaGetzUb on Fri Aug 13, 2010 12:43 am, edited 19 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 9:25 am

Re: Dream Physics Engine

Post by Sly_Jack0 » Sat Oct 24, 2009 8:01 pm

FPS oli kokoajan 61, eikä tällä koneella (lue: näytölllä) sen suurempiin nopeuksiin päästäkään. =)

User avatar
MikkoK
Devoted Member
Posts: 813
Joined: Thu Jun 05, 2008 2:13 pm
Location: City 17

Re: Dream Physics Engine

Post by MikkoK » Sat Oct 24, 2009 9:46 pm

FPS oli kokoajan 86 komea räsynukke kylläkin. :P

Code: Select all

#aha. @ IRCNet
<Grandi> Voit laittaa jo valmiiks hailaittiin "Amis-Mikko", koska alan kutsua sua sillä nimellä.

User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 3:40 pm
Location: Lempäälä

Re: Dream Physics Engine

Post by kaneli2000 » Sat Oct 24, 2009 9:58 pm

Aika saamarin hieno :o. FPS oli koko ajan 60-61.

Aiotko antaa sorsaa jakoon?
I see the rainbow rising

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine

Post by MaGetzUb » Sat Oct 24, 2009 10:07 pm

Juu sorsat tulevat jakoon. :) Kunhan saan vielä vähän säädettyä moottoriani. Sitten tulee vielä käyttäjiä helpottavia koodeja kuten esim. ridgid bodyjen luomiseen tarkoitettu kirjasto.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by CCE » Sat Oct 24, 2009 11:54 pm

Mavia iski, saattaa tosin johtua siitä että näyttöni resoluutio on vain 1024x768 :P

User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 3:40 pm
Location: Lempäälä

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by kaneli2000 » Sun Oct 25, 2009 12:02 am

CCE wrote:Mavia iski, saattaa tosin johtua siitä että näyttöni resoluutio on vain 1024x768 :P
Minulla on 1280x1024 ja silti iski.
I see the rainbow rising

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by MaGetzUb » Sun Oct 25, 2009 12:03 am

Bugi löydetty, olin vahingossa koodiani siivotessa pienentänyt taulukkoa. :D
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
Substance
Active Member
Posts: 234
Joined: Fri Mar 14, 2008 6:48 pm

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by Substance » Sun Oct 25, 2009 5:19 pm

Eikös tämä systeemi ollut jo toteutettu? No, se on kyllä paremmin tehty tässä kirjastossa :) Pakko kuitenkin mainostaa, että olen nyt jo kuukauden tehnyt FurySoldieriin jatko-osaa tällaisella fysiikkamallilla.
Substance aka LittleGreen
Red Encounter - shoot'em uppia - lataus

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine | Examplen mavi korjattu

Post by MaGetzUb » Sun Oct 25, 2009 5:48 pm

LittleGreen wrote:Eikös tämä systeemi ollut jo toteutettu? No, se on kyllä paremmin tehty tässä kirjastossa :) Pakko kuitenkin mainostaa, että olen nyt jo kuukauden tehnyt FurySoldieriin jatko-osaa tällaisella fysiikkamallilla.
SPuntellahan oli tällainen systeemi, mutta eipä hän ole koskaan pistänyt aivan kaikkia koodeja jakoon.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Dream Physics Engine

Post by tuhoojabotti » Mon Oct 26, 2009 12:34 am

Narusimulaatio pyöri täydellä nopeudella vielä 400 partikkelin kanssa, mutta alkoi jo bugaamaan fysiikat sitten. ;)
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”

Jee

Re: Dream Physics Engine

Post by Jee » Mon Oct 26, 2009 5:09 pm

ei.. Mun coolbasic on rikki ehkä. Se mavaa tässäkin ohjelmassa, siinä lukee Memory...
Koitin uudelleen asentaa mutta ei toimi =(

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine

Post by MaGetzUb » Mon Oct 26, 2009 5:23 pm

Jee wrote:ei.. Mun coolbasic on rikki ehkä. Se mavaa tässäkin ohjelmassa, siinä lukee Memory...
Koitin uudelleen asentaa mutta ei toimi =(
Jos käytössäsi on Windows Vista, käynnistä CoolBasic järjestelmän valvojana. ;) Ei kyllä koodissa pitäisi olla mitään vikaa..
Tässä teille uusi esimerkki:

Code: Select all

Include "Dream Physics Libary.CB"
Dim part(4)
Dim Images(360)

SCREEN 1024,768

Imag = LoadImage("Media\Grass.BMP")
ResizeImage imag,100,100
For i = 0 To 360
    Images(i) = CloneImage(Imag)
    RotateImage Images(i),-i
Next i



part(1) = AddParticle(MouseX()-50,MouseY()-50)
part(2) = AddParticle(MouseX()+50,MouseY()-50)
part(3) = AddParticle(MouseX()-50,MouseY()+50)
part(4) = AddParticle(MouseX()+50,MouseY()+50)
part(0) = AddParticle(MouseX(),MouseY())
hdist = Distance(0,0,50,50)
h2dist = Distance(0,0,100,100)
pointing = 0
MouseHold = True 
AddText "Use mouse scroll to choose controlling point"
AddText "Click mouse left button to set box free or catch it"
Repeat 

    pointing = pointing + MouseMoveZ()
    pointing = Max(0,Min(pointing,4))
    
    If MouseHit(1) Then MouseHold = Not MouseHold
    If MouseHold = True Then 
    SetParPosition(part(pointing),MouseX(),MouseY()) 
    EndIf 
    a = (GetVectorAngle(part(1),part(2)))
    DrawImage Images(Int(WrapAngle(a))),GetParX(part(0)),GetParY(part(0))


    SetParDist(part(1),part(0),hdist)
    SetParDist(part(2),part(0),hdist)
    SetParDist(part(3),part(0),hdist)
    SetParDist(part(4),part(0),hdist)
    
    SetParDist(part(1),part(2),100)
    SetParDist(part(2),part(3),100)
    SetParDist(part(3),part(4),100)
    SetParDist(part(4),part(1),100)
    
    SetParDist(part(1),part(3),h2dist)
    SetParDist(part(2),part(4),h2dist)
    
    
    
    
    CalculateParPositions(0,0.2)
    
    ParticlesAbsoluteArea(25,25,ScreenWidth()-25,ScreenHeight()-25)

DrawScreen
Forever 
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Dream Physics Engine

Post by SPuntte » Tue Oct 27, 2009 1:17 am

Jahas. Hienoa, että joku muukin täällä jaksaa kiinnostua fysiikasta. Omat yritelmäni ovat kariutuneet ajan/suunnittelun/kärsivällisyyden puutteeseen. En ole silti missään vaiheessa hylännyt CoolPhysicsEngineä; hiljaa hyvä tulee. Itse asiassa minun piti julkaista tutoriaali tekniikasta, jota tämäkin systeemi (ilmeisesti) hyödyntää. En vaan ole saanut laiskuudeltani kirjoitettua sitä.

Vaihdoin Eee:heni EasyPeasy-linukan, joten en nyt jaksa tätä ainakaan vielä kokeilla, kun ei ole edes Wineä saati CB:tä asennettuna/konffattuna. Kommentoin tarkemmin sitten, kun kokeilen.
MaGetzUb wrote:Btw, kiitos vaan avusta SPuntelle!
Kuten sanottu, on hienoa, kun joku kiinnostuu omasta tekeleestä niin paljon, että haluaa itse toteuttaa saman. Apua heruu kyllä jatkossakin, rohkeasti vaan kysymään.
MaGetzUb wrote:Tulevat lisäominaisuudet:
- DrawImagePar() - Piirtää kuvan partikkelin siainteihin
- ParticleImageCollision() - Käyttää kuvaa pikselin tarkasti törmäyspintana
- SetParDist:n lisäys: Pitää vektorin sovittujen kulmien välillä toiseen vektoriin nähden. Tämä päivitys ei tule ihan heti, minun pitää ottaa selvää, miten tämä toimii.
- VectorIntersect() - Kertoo onko kaksi vektoria päällekkäin.
Kulmarajoittimien toteutus on hankalampaa kuin etäisyyksiin perustuvien ihan siitä syystä, että mikä tahansa kulma (kiertymä on eri asia) voidaan esittää kuinka monella tavalla hyvänsä (esim. 30° = 390° = -330°).

Apuna voi käyttää väikkapa vektorien pistetuloa. a.b=|a||b| cos(theta) <=> theta = cos⁻¹( (a.b) / (|a||b|) ) Tässä on kuitenkin se ongelma, että että vektorien välinen kulma on aina väliltä 0°...180° suuntien "järjestyksestä" huolimatta. Siksi esimerkiksi rajoitus "vektori b ei saa osoittaa sille sektorille, joka ulottuu vektorista a 47° myötäpäivään ja 104° vastapäivään" ei ole suoraan sen avulla mahdollinen.

Kuvaillun kaltaisessa tapauksessa täytyy lisäksi käyttää vektorien ristituloa (joka kaksiulotteisella näytöllä on tulkittavissa pelkäksi skaalariksi). Ristitulon etumerkki axb kertoo, onko a b:sta katsoen lähempänä myötä- vai vastapäivään.

Ja tuohon viimeiseen kohtaa sellainen huomautus, että vektoreilla on vain suunta ja pituus, ei sijaintia. Siispä kahden vektorin päällekkäisyyden tutkiminen on irrelevanttia. Tarkoititko kahden pisteen paikkavektorin välille asetetun janan leikkausta toisen vastaavan janan kanssa?

Lisäksi voisin antaa sellaisen vinkin, että sallimalla partikkelisidokselle muutaman erilaisen tilan moottorista tulee heti huomattavasti monipuolisempi. Itselläni on yksi versio, jossa sidoksen voi määritellä pituudeltaan joko:
1) vakioksi
2) välille [a, ∞[ (etäisyys suurempi tai yhtäsuuri kuin a)
3) välille [0, a] (etäisyys pienempi tai yhtäsuuri kuin a)
4) välille [a, b] (etäisyys jotakin a:n ja b:n väliltä)
missä a ja b ovat mielivaltaisia positiivisia reaalilukuja
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine

Post by MaGetzUb » Tue Oct 27, 2009 4:06 pm

SPuntte wrote: Lisäksi voisin antaa sellaisen vinkin, että sallimalla partikkelisidokselle muutaman erilaisen tilan moottorista tulee heti huomattavasti monipuolisempi. Itselläni on yksi versio, jossa sidoksen voi määritellä pituudeltaan joko:
1) vakioksi
2) välille [a, ∞[ (etäisyys suurempi tai yhtäsuuri kuin a)
3) välille [0, a] (etäisyys pienempi tai yhtäsuuri kuin a)
4) välille [a, b] (etäisyys jotakin a:n ja b:n väliltä)
missä a ja b ovat mielivaltaisia positiivisia reaalilukuja
Mites tuo homma nyt oikein toimii? :) En oikein sisäistänyt.
Pai to vei, olen suunnittelemassa tekeväni tämän Dream Physics Enginen Free Basicilla Dynamic Link Libary muotoon (DLL) jotta, voi laskea tulevaisuudessa muillakin kun vain cb:lä näitä fysiikoita. :)
eka kumminkin pitää perehtyä paremmin FB:hen
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Dream Physics Engine

Post by SPuntte » Tue Oct 27, 2009 4:38 pm

MaGetzUb wrote:Mites tuo homma nyt oikein toimii? :) En oikein sisäistänyt.
Njoo, ehkä tuli vähän turhan matemaattisesti selitettyä.

Eli idea on, että sidoksella on jonkin tilamuuttuja, esimerkiksi kokonaislukutyyppinen tyyppi-kenttä. Tälle annetaan jokin arvo, esim. nollasta kolmeen.

Sitten lisäät sidoksia korjaavaan rutiiniin if...elseif -yhdistelmän (selectiä en suosittele, sillä se on useasti aiheuttanut minulla MAVeja), jossa tarkistat, korjataanko sidoksen pituutta sen mukaan, mihin moodiin se on asetettu.

Jos otetaan nuo neljä mainitsemaani vaihtoehtoa, niillä homma menisi pseudona suunnilleen näin:

Code: Select all

Const kiinteä = 0
Const suurempikuin = 1
Const pienempikuin = 2
Const väliltä = 3
...
If moodi = kiinteä
    Korjaa sidoksen pituus
ElseIf moodi = suurempikuin And sidoksen pituus < minimipituus
    Aseta sidoksen pituudeksi minimipituus
ElseIf moodi = pienempikuin And sidoksen pituus > maksimipituus
    Aseta sidoksen pituudeksi maksimipituus
Elseif moodi = väliltä
    If maksimipituus < sidoksen pituus
        Aseta sidoksen pituudeksi maksimipituus
    ElseIf sidoksen pituus < minimipituus
        Aseta sidoksen pituudeksi minimipituus
    Else
        Sidos on halutulla välillä eikä siihen tarvitse koskea
    EndIf
Else
    Koodissasi on kärpänen
EndIf
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

Resoluutio

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by Resoluutio » Sat Dec 19, 2009 5:38 pm

kaneli2000 wrote:
CCE wrote:Mavia iski, saattaa tosin johtua siitä että näyttöni resoluutio on vain 1024x768 :P
Minulla on 1280x1024 ja silti iski.
Hahhaa :D mulla on resoluutio 1920x1200

User avatar
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm
Location: Sulkava

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by Awaclus » Sat Dec 19, 2009 5:43 pm

Resoluutio wrote:
kaneli2000 wrote:
CCE wrote:Mavia iski, saattaa tosin johtua siitä että näyttöni resoluutio on vain 1024x768 :P
Minulla on 1280x1024 ja silti iski.
Hahhaa :D mulla on resoluutio 1920x1200
Hahhaa, mulla ei, mutta en silti herättele kahta kuukautta vanhaa topiccia pelkästään tämän sanomiseksi.
Every day I'm reshuffling.
[22:19] <@Grandi> Ha! Tiesin koko ajan, että Awaclus_ oli Awaclus. Hieno peitenimimerkki, mutta Grandia et huiputtanut.

Post Reply

Who is online

Users browsing this forum: Bing [Bot] and 26 guests