Dream Physics Engine

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

Dream Physics Engine

Post by MaGetzUb »

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 405 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.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: Dream Physics Engine

Post by Sly_Jack0 »

FPS oli kokoajan 61, eikä tällä koneella (lue: näytölllä) sen suurempiin nopeuksiin päästäkään. =)
MikkoK
Devoted Member
Posts: 813
Joined: Thu Jun 05, 2008 2:13 pm
Location: City 17

Re: Dream Physics Engine

Post by MikkoK »

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 2:40 pm
Location: Lempäälä

Re: Dream Physics Engine

Post by kaneli2000 »

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

Aiotko antaa sorsaa jakoon?
I see the rainbow rising
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine

Post by MaGetzUb »

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 »

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 2:40 pm
Location: Lempäälä

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by kaneli2000 »

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
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by MaGetzUb »

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 5:48 pm

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by Substance »

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
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine | Examplen mavi korjattu

Post by MaGetzUb »

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.
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Dream Physics Engine

Post by tuhoojabotti »

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 »

ei.. Mun coolbasic on rikki ehkä. Se mavaa tässäkin ohjelmassa, siinä lukee Memory...
Koitin uudelleen asentaa mutta ei toimi =(
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine

Post by MaGetzUb »

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.
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 »

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
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Dream Physics Engine

Post by MaGetzUb »

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.
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 »

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 »

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
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Dream Physics Engine | SOURCET JAOSSA!

Post by Awaclus »

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.
Post Reply