CoolPhysicsEngine - Fysiikkakirjasto CB:lle -tekniikkademo#2

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Wolfman
Newcomer
Posts: 37
Joined: Sat Apr 12, 2008 9:43 pm

Re: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by Wolfman »

Masteri. Ihan itsesi takia, paranna kirjoitusasuasi, ja lopeta tuo paskanjauhanta. Ei sinulla ole oikeutta tulla tänne päätäsi aukomaan, kuinka helppoa mikäkin on. Jos et osaa ampumista kunnolla tehdä, tai tiedä mitä funktiot ovat, olisi parasta pitää suu supussa. Ja copy&pasten osaa tehdä kuka vain, fysiikkakirjastoa harvemmat.

Banaani lähestyy, tunnen sen.
EDIT:

Oho, banaania tuli jo :D

Image
User avatar
elmo123
Active Member
Posts: 153
Joined: Sun Sep 09, 2007 4:19 pm

Re: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by elmo123 »

masteri wrote:voin opettaa ihan ilmatteekskin.
Painovoima on sellanen jumalan luoma juttu ettei ihmiset pääsis taivaaseen niin helposti.
jumala ei nääs tykkää että sitä häiritään.
ilman painovoimaa ihmiset lentäis avaruuteen.
massa on olemassa.

palvokaa mua.
Jokainen saa uskoa mihin haluaa, mutta todellisuudessa painovoima on tätä:

Avaruudessa on jatkuvasti kasvavaa painotonta tilaa. Kappaleet, joilla on iso massa, vetävät kevyempiä kappaleita puoleensa. Koska olemme maapalloon massassa verrattuna yhtä kuin muurahainen kuutiodesimetrin kokoisen neutronitähden rinnalla, menemme jatkuvasti kohti maapallon keskipistettä.
Emme vajoa sulaan laavaan, koska kova maa tulee vastaan. Sama kuin petaisit petisi, ottaisit peiton pois, pistäisit lakanalle metallikuulan ja pistäisit vierelle eripainoisen metallikuulan. Kevyempi menee lakanalla aina kohti painavampaa, kuten avaruudessa(Tämä kokeilu ei toimi, jos sinulla ei ole sängyssäsi patjaa lainkaan).

Miksi meidän pitäisi palvoa sinua, kun kerran luotat enemmän uskontoon kuin tieteeseen?
Kiinnostuin pelien tekemisestä ennen 1. luokkaa.
Sitten 3. luokalla tuli CB. Ja siitä se alkoi.

Blender! TF2! CB! Game Maker! Nokia-mollaus! Kitaransoitto! Breakdance! MadTracker! Minecraft!
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by MaGetzUb »

elmo123 wrote:
masteri wrote:voin opettaa ihan ilmatteekskin.
Painovoima on sellanen jumalan luoma juttu ettei ihmiset pääsis taivaaseen niin helposti.
jumala ei nääs tykkää että sitä häiritään.
ilman painovoimaa ihmiset lentäis avaruuteen.
massa on olemassa.

palvokaa mua.
Jokainen saa uskoa mihin haluaa, mutta todellisuudessa painovoima on tätä:

Avaruudessa on jatkuvasti kasvavaa painotonta tilaa. Kappaleet, joilla on iso massa, vetävät kevyempiä kappaleita puoleensa. Koska olemme maapalloon massassa verrattuna yhtä kuin muurahainen kuutiodesimetrin kokoisen neutronitähden rinnalla, menemme jatkuvasti kohti maapallon keskipistettä.
Emme vajoa sulaan laavaan, koska kova maa tulee vastaan. Sama kuin petaisit petisi, ottaisit peiton pois, pistäisit lakanalle metallikuulan ja pistäisit vierelle eripainoisen metallikuulan. Kevyempi menee lakanalla aina kohti painavampaa, kuten avaruudessa(Tämä kokeilu ei toimi, jos sinulla ei ole sängyssäsi patjaa lainkaan).

Miksi meidän pitäisi palvoa sinua, kun kerran luotat enemmän uskontoon kuin tieteeseen?
Jos saisin kerran luvan oikeasti modettaa nii, sanoisin vaan että tääl ei puhuta ny uskosta, vaan fysiikasta, gravitaatiosta! Laskennasta! Jos yrität CB:tä saada toimimaan uskon voimalla passittaisin mielisairaalaan, tuntuisi pikkaisen toivottomalta! En siis tarkoita millään pahalla. mutta uskon asiat ja fysiikka on ihan eri asia! (Toivottavasti oikeat modet ei ota nokkiinsa...) Ja jos yrittää olla hauska nii menkööt jollekkin vitsien vääntö sivulle... Jos kellään ei ole mitään asiasta mainintaa niin voitaisiinko me ystävällisesti jatkaa aihetta? (Otin ohjat käsiin pahemman kerran, mutta toivon, että jotkut ymmärtäisivät, kuinka paljon tämä aihe voi kiinnostaa muita... Anteeksi nyt vielä kerran. :shock: )
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: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by SPuntte »

Sulatellaampas vähän tätä viestiketjua jään alta.

Tuli tässä taas kaipuu fysiikan pariin, joten ajattelin tarttua ehkä tähän projektiin. Olen kääntänyt internetin bittejä ympäri kuin kompostia talikolla ja kahminut sieltä megatavuittain PDF-muotoisia artikkeleita ja luentomateriaalia laskennallisesta fysiikasta. Olen tullut siihen tulokseen, että ainoa isompi tietotaito, mikä nyt puuttuu on polygonipohjainen törmäysjärjestelmä isoille määrille dataa. Ajatelin olla kunnianhimoinen ja toteuttaa sen heti samantien myös koverille polygoneille, mutta päätin sitten, ettei projekti kaadu liian kakun haukkaamiseen kerralla, joten tehdään systeemi ensin "vain" mielivaltaisille kuperille polygoneille. Kum törmäysmoottori kertoo törmäyspisteet ja pinnan normaaliyksikkövektorin, impulssikone hoitaa loput.

Matematiikka on hyvällä pohjalla systeemiä varten: minulla on kokonainen funktio-TYPE -kirjasto kirjoitettuna CBlle vektoreita sun muita matemaattisia olioita varten jo ihan muista projekteista. Valitettavasti koodista vaan tulee CB:llä aika ilkeän näköistä, kun tässä kielessä ei ole operaattorien ylikuormitusta ja jokainen komponentti täytyy käsitellä erikseen :geek: Muutenkin laskennallinen puoli on ihan kondiksessa. Verlet-integraattori toimii riittävän tarkasti ja luotettavasti CB:lläkin eikä sen soveltamisen impulsseihin pitäisi tuottaa ongelmia. Pitää vaan kirjoitella kauheat kasat vektorilaskutoimituksia. Kaiken kukkuraksi pitää muistaa ottaa huomioon pyörimiset, jotka nekin ovat vektorisuureita (kulmanopeus ja momentti), joten laskentapuoli tulee varmasti olemaan hupaisaa pistetulo-ristitulo -sotkua.

Itse fysiikkasysteemi tulee varmaan käyttämään impulssien ja "vapauden akseleiden rajoittimien" (constraints) yhdistelmää. törmäykset siis saavat kappaleiden liikkeessä ja pyörimisessä aikaa muutoksia. Ja kappaleita voi myös kytkeä toisiinsa. Ensimmäisessa viestissä esittelemäni jutut tulevat siis olemaan mahdollisia, mutteivat enää kirjaston päätarkoitus.

Rajapinnan osalta kirjastossa tulee olemaan grafiikan liittäminen pellin alla pyöriviin polygoneihin (tai oikeastaan toisinpäin) ja ehkä myös älykäs polygonien luominen grafiikan perusteella. Tästä sitten lisää myöhemmin, kun saan konepellin alla asiat synkkaamaan..

Kiitos, kuulemiin
ystävänne SPuntte
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by Koodiapina »

Kai tästä tulee sentään semmoinen, että perus CB:läinenkin osaa käyttää? Noi termit kuulostivat nimittäin melko hurjilta O_o
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by koodaaja »

Sehän kirjastoissa on ideana: hankalat asiat on tehty valmiiksi. Eli vaikka termistö on monimutkaista, kirjasto tulee olemaan helppokäyttöinen. Ainakin, jos se on hyvä ;D

Ja hyvää vaikuttaisi olevan tulossa. Vallan muikeaa, etten sanoisi. Mikäli polygonitörmäys ei aiheuta pahempia pätkimisiä, tästä tulee todella hyödyllinen kirjasto. Jotta onnea matkaan (:
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Räsynukke- (ja fysiikkamoottorikirjasto) CBlle!

Post by axu »

Milloin tämän kirjaston voisi ladata, vai voiko sitä jo?
Näyttää niiin siistiltä :shock:
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: CoolPhysicsEngine

Post by SPuntte »

Pientä väliaikatiedotusta.

Kuten tuolla allekirjoitukseni puolella olenkin jo hypettänyt, olen taas tehnyt tämän eteen jotain, ja motivaatiota projektiin on ihan kiitettävästi.

Tajusin, ettei Verlet-algoritmi toimi tässä projektissa, kun Impulssien vaikutukset kappaleisiin kontrolloivat juuri nopeutta, mikä Verlet-algoritmissa kokonaan skipataan paremman tarkkuuden saavuttamiseksi. Impulssi nimittäin määritellään voimavektorin integraalina ajan yli (I = ∫F dt) mutta impulssiperiaate sanoo, että kappaleeseen kohdistunut impulssi on yhtä suuri kuin kappaleen liikemäärän muutos (I = ∆p). Liikemäärä taas on kapaleen nopeus kertaa sen massa eli saadaan että I = ∆p = m∆v. Tätä yhtälöä muokkaamalla saadaan tulos, että nopeuden muutos (∆v) voidaan siis laskea, kun impulssi ja kappaleen massa tunnetaan, siis ∆v = I/m.

Tarvitsin siis kokonaan uusen integrointimenetelmän, joten lähdin etsimään jotain parempaa. Aluksi toteutin keskipistemenetelmän, joka on ikäänkuin parannettu Eulerin menetelmä. Halusin kuitenkin parempaa tarkuutta, joten lopulliseksi systeemiksi valitsin Runge-Kutta -algoritmin, joka perustuu Taylorin sarjaan. Se vaatii toki enemmän laskentaa kuin Euler tai Verlet, mutta vastaavasti virheet kutistuvat murto-osaan, jolloin aika-askelta voidaan pidentää.

Tehtynä on:
- kattava tyyppi- ja funktiokirjasto matematiikkaa (lähinnä vektoreita) varten, kauttaaltaan valmis
- integraattori, valmis(?); testauksessa

To do -lista: (suluissa prioriteetti)
- törmäystunnistus polygoneille (#1)
- logiikka ajamaan fysiikkaa, laskemaan impulsseja, jne.. (#2)
- kirjaston käyttöfunktiot (#3)
- lisää ominaisuuksia (muuta kuin impulssit: harmoniset värähtelijät eli jouset, useammat törmäystasot, "constraints", jne..)

Kun saan tuosta kaksi ensimmäistä jotenkuten toimimaan, voisin tarjoilla seuraavaa demoa. Toivottavasti sitä pukkaisi ennen joulua..
Milloin tämän kirjaston voisi ladata, vai voiko sitä jo?
Näyttää niiin siistiltä
Ei voi, vielä. Eikä varmaan hetkeen aikaan. Mutta kyllä tämä tästä..
Kai tästä tulee sentään semmoinen, että perus CB:läinenkin osaa käyttää? Noi termit kuulostivat nimittäin melko hurjilta O_o
Tarkoitus olisi. Sen verran pitää itse osata, että kertoo kappaleiden jotain ominaisuuksia, kuten tiheyden, kitka- ja kimmoisuuskertoimet kahden kappaleen välille jne. Myös (alkuvaiheessa ainakin) pitää myös polygonien kärkipisteet määritellä kuvan keskipisteen suhteen.
EDIT:

Sly_Jack0: LOL :twisted:

Last edited by SPuntte on Mon Aug 18, 2008 9:11 pm, edited 1 time in total.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: CoolPhysicsEngine

Post by Sly_Jack0 »

Öftöpic:
Pisti tämä silmään ja oli ihan pakko sanoa. Anteeksi.

eli saadaan että I = ∆p = m∆v

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

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle

Post by SPuntte »

Olen tässä pähkäillyt, miten toteuttaa kirjaston polygonimoottori. Tehtävä ei ole ihan helppo, sillä CBstä puuttuu käyttökelpoisia rakenteita, kuten tyyppien sisäiset taulukot. Tällöin tyyppiin voisi suoraan taulukoida arvot kärkipisteille. Jo dynaamiset taulukot auttaisivat vähän. Jäljelle jääkin sitten enää linkitetty lista, joka sekin täytyy rakentaa itse, mutta onnistuu kohtalaisen helposti. Sen varjopuoli on, että ainoa toteutustapa sille ovat Tyyppi-instanssit, jotka minun kokemukseni mukaan ovat herkkiä mysteerisille MAVeille.

Tarvitaan siis POLYGONI-tyyppikokoelma, jossa on tieto kärkipisteiden määrästä ja kappaleen sijainnista sekä muista ominaisuuksista. Siitä on myös osoitin ensimäiseen KÄRKIPISTE-tyypin instanssiin, josta on edelleen osoitin seuraavaan, ja siitä seuraavaan, jne.. kunnes vastaan tulee viimeinen kärkipiste. Kärkipiste kantaa datana ainoastaan oman paikkavektorinsa polygonin painopisteen suhteen osoittimen lisäksi.

Kun raamit ovat kasassa, polygoneilla leikkiminen on kohtuullisen helppoa. Kaivelin netistä vähän laskukaavoja, joilla homma hoituu..

Tässä pieni demo, joka ei vielä tosin sisällä linkitettyä listaa polygonin käsittelyyn (lievä purkkaviritys sen sijaan omasta mielestäni), mutta ainakin avaa vähän sitä, mikä fysiikkalaskennassa on monikulmioiden kannalta olennaista. Ohjelmassa voi siirrellä(WASD) ja pyöritellä(sivunuolet) yhtä monikulmiota, jonka kärkipisteiden määrää voi muuttaa(PageUp ja PageDown). Monikulmion saa arvottua välilyönnistä. Koodista lienee hyötyä vähän edistyneemmille koodareille, jos heillekään. Päivittelen uuteen, kun saan linkitetyn lista valmiiksi. Sillä välin voitte vilkuilla laskukaavoja ja antaa parannusehdotuksia konsepteihini :P

Code: Select all

//Polygonidemo by SPuntte
//©2008

//Tyyppikokoelma monikulmion kärkipisteille
Type VERTEX
	//paikka painopisteen suhteen
    Field cX# 
    Field cY#
	//osoitin seuraavaan
    Field nextID%
	//järjestysluku
    Field n%
EndType

Global nGon As Integer
Global cntrX#, cntrY#, orient# As Float

//Montako kulmaa
nGon = 8

//Keskimääräinen "säde"
nGonRadius = 100

//Väliaikaisdataa varten
Dim IDtmp(nGon) As Integer
Dim rTmp(1,nGon) As Float

//Luodaan monikulmio
initGon(nGonRadius)
cntrX = 0
cntrY = 0

SCREEN 800, 600, 0, 1

Repeat
    Color 255, 255, 255
    Text 5,  5, "Painopisteen X-koordinaatti = " + cntrX
    Text 5, 18, "Painopisteen Y-koordinaatti = " + cntrY
    Text 5, 31, "Kierokulma = " + orient
    Text 5, 44, "Monikulmion ala = " + nGonArea() + " pikseliä"
    Text 5, 580, "FPS: " + FPS()

    cntrX = cntrX + KeyDown(cbKeyD) - KeyDown(cbKeyA)
    cntrY = cntrY + KeyDown(cbKeyW) - KeyDown(cbKeyS)
    orient = WrapAngle(orient + LeftKey() - RightKey())
    
    If KeyHit(201) And nGon < 15 Then
        nGon = nGon + 1
        resetGon(nGonRadius)
    ElseIf KeyHit(209) and nGon > 3 Then
        nGon = nGon - 1
        resetGon(nGonRadius)
    ElseIf KeyHit(cbKeySpace) Then
        resetGon(nGonRadius)
    EndIf
    
    drawGon()
    DrawScreen
Forever

//Pyyhkii vanhan monikulmion ja luo uuden
Function resetGon(r#)
    ClearArray ON
    ReDim IDtmp(nGon) As Integer
    ReDim rTmp(1,nGon) As Float
    
    For vx.VERTEX = Each VERTEX
        Delete vx
    Next vx
    
    //vanha sijainti talteen
    tmpX# = cntrX
    tmpY# = cntrY
    initGon(r#)
    cntrX = tmpX
    cntrY = tmpY
EndFunction

//Alustaa monikulmion
Function initGon(r#)
    //Luodaan satunnaisesti pyydetty mkäärä kärkipisteitä
    For i = 1 To nGon
        vx.VERTEX = New(VERTEX)
        vx\N% = i
        aTmp# = Float(i * 360.0/nGon) + Rnd(-15, 15)
        rTmp# = r# + Rnd(-0.5*r#, 0.5*r#)
        vx\cX# = Cos(aTmp#) * rTmp#
        vx\cY# = Sin(aTmp#) * rTmp#
        IDtmp(i) = ConvertToInteger(vx)
    Next i
    //sisällytetään jokaiseen osoitin seuraavaan kärkipisteeseen
    For vx.VERTEX = Each VERTEX
        tmpNext% = vx\n% + 1
        If tmpNext% > nGon Then tmpNext% = 1
        vx\nextID% = IDtmp(tmpNext%)
    Next vx
    //Lasketaan painopiste
    area# = nGonArea()
    cntrX = nGonCentroidX(area#)
    cntrY = nGonCentroidY(area#)
    //Korjataan kärkipisteiden koordinaatit, kun painopiste on tiedossa
    For vx.VERTEX = Each VERTEX
        vx\cX# = vx\cX# - cntrX
        vx\cY# = vx\cY# - cntrY
    Next vx
EndFunction

//Piirtää monikulmion
Function drawGon()
    //Painopiste
    Color 0, 255, 0
    Dot WXtoSX(cntrX), WYtoSY(cntrY)
    Circle WXtoSX(cntrX - 3), WYtoSY(cntrY + 3), 7, 0
    
    For vx.VERTEX = Each VERTEX
        vNext.VERTEX = ConvertToType(vx\nextID%)
        //särmä
        Color 128, 128, 128
        Line WXtoSX(cntrX + RotatedX(vx\cX#, vx\cY#, orient)), WYtoSY(cntrY + RotatedY(vx\cX#, vx\cY#, orient)), WXtoSX(cntrX + RotatedX(vNext\cX#, vNext\cY#, orient)), WYtoSY(cntrY + RotatedY(vNext\cX#, vNext\cY#, orient))
        //kärkipiste
        Color 0, 255, 255
        Dot WXtoSX(cntrX + RotatedX(vx\cX#, vx\cY#, orient)), WYtoSY(cntrY + RotatedY(vx\cX#, vx\cY#, orient))
        Dot WXtoSX(cntrX + RotatedX(vNext\cX#, vNext\cY#, orient)), WYtoSY(cntrY + RotatedY(vNext\cX#, vNext\cY#, orient))
    Next vx
EndFunction

//Laskee itseään leikkaamattoman n-kulmion pinta-alan
Function nGonArea()
    result# = 0
    //Taulukoidaan vektorit, jotta niihin päästään helposti käsiksi for-silmukasta
    For vx.VERTEX = Each VERTEX
        rTmp(0, vx\n%) = vx\cX#
        rTmp(1, vx\n%) = vx\cY#
    Next vx
    //A = 1/2 i=1|Summa|n {x[i]y[i+1] - x[i+1]y[i]}
    //missä
    //x(n+1) = x(1), y(n+1) = y(1)
    For i = 1 To nGon
        tmpNext% = i + 1
        If tmpNext% > nGon Then tmpNext% = 1
        result# = result# + (rTmp(0, i) * rTmp(1, tmpNext) - rTmp(0, tmpNext) * rTmp(1, i))
    Next i
    Return Abs(0.5 * result#)
EndFunction

//Laskee itseään leikkaamattoman n-kulmion painopisteen x-koordinaatin, kun kyseisen monikulmion ala tunnetaan
Function nGonCentroidX(area#)
    result# = 0
    //Taulukoidaan vektorit, jotta niihin päästään helposti käsiksi for-silmukasta
    For vx.VERTEX = Each VERTEX
        rTmp(0, vx\n%) = vx\cX#
        rTmp(1, vx\n%) = vx\cY#
    Next vx
    //x' = 1/6A i=1|Summa|n {(x[i] + x[i+1])(x[i]y[i+1] - x[i+1]y[i])}
    //missä
    //x(n+1) = x(1), y(n+1) = y(1)
    For i = 1 To nGon
        tmpNext% = i + 1
        If tmpNext% > nGon Then tmpNext% = 1
        result# = result# + (rTmp(0, i) + rTmp(0, tmpNext))*(rTmp(0, i) * rTmp(1, tmpNext) - rTmp(0, tmpNext) * rTmp(1, i))
    Next i
    If area# <> 0 Then
        Return result#/(6.0*area#)
    EndIf
EndFunction

Function nGonCentroidY(area#)
    result# = 0
    //Taulukoidaan vektorit, jotta niihin päästään helposti käsiksi for-silmukasta
    For vx.VERTEX = Each VERTEX
        rTmp(0, vx\n%) = vx\cX#
        rTmp(1, vx\n%) = vx\cY#
    Next vx
    //y' = 1/6A i=1|Summa|n {(y[i] + y[i+1])(x[i]y[i+1] - x[i+1]y[i])}
    //missä
    //x(n+1) = x(1), y(n+1) = y(1)
    For i = 1 To nGon
        tmpNext% = i + 1
        If tmpNext% > nGon Then tmpNext% = 1
        result# = result# + (rTmp(1, i) + rTmp(1, tmpNext))*(rTmp(0, i) * rTmp(1, tmpNext) - rTmp(0, tmpNext) * rTmp(1, i))
    Next i
    If area# <> 0 Then
        Return result#/(6.0*area#)
    EndIf
EndFunction

//Palauttaa vektorin x#i + y#j uuden x-komponentin, kun vektoria kierretään phi# astetta
Function rotatedX(x#, y#, phi#)
    Return x# * Cos(phi#) - y# * Sin(phi#)
EndFunction

//Palauttaa vektorin x#i + y#j uuden Y-komponentin, kun vektoria kierretään phi# astetta
Function rotatedY(x#, y#, phi#)
    Return x# * Sin(phi#) + y# * Cos(phi#)
EndFunction

//Muunnos karteesisesta koordinaatistosta ikkunan koordinaatistoon
Function WXtoSX(objX)
    Return objX+ScreenWidth()/2.0-CameraX()
EndFunction

Function WYtoSY(objY)
    Return -objY+ScreenHeight()/2.0+CameraY()
EndFunction
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -Uusi "minidemo"

Post by Koodiapina »

Hienoa settiä taas kerran. En kyllä ymmärtänyt noista laskuista mitään, mutta hyvin näyttää systeemi toimivan, vaikka joudut ilmeisesti koodaamaan osin purkkaa. Sellanen kyllä pisti silmään, että miten kummassa tuolla voi olla kuvio, jonka ala on 20630.9 pikseliä? Kun ei ainakaan minun näytössäni ole kuin kokonaisia pikseleitä :D
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -Uusi "minidemo"

Post by SPuntte »

Grandi wrote:Hienoa settiä taas kerran. En kyllä ymmärtänyt noista laskuista mitään, mutta hyvin näyttää systeemi toimivan, vaikka joudut ilmeisesti koodaamaan osin purkkaa.
Tänks. Siinä yritin kommentteihin laittaa sitä kaavaa muttei ole mikään ihme, jos sitä ei tajua, kun ilmaisumuoto on niin epäselvä. Wikipediasta löytyy lisätietoa aiheesta.

Edellisessä viestissäni esittelemä systeemi on vielä aika purkka mutta toivon saavani sen toimimaan myös "purkattomalla" tavalla, kuten samaisessa viestissäni kuvailin.
Grandi wrote:Sellanen kyllä pisti silmään, että miten kummassa tuolla voi olla kuvio, jonka ala on 20630.9 pikseliä? Kun ei ainakaan minun näytössäni ole kuin kokonaisia pikseleitä :D
Duh, tuo ala on vain laskennallinen arvo. Todellinen pinta-ala vaihtelee monikulmion asennon mukaan. Kun laskuissa ja muutenkin koodissa yksikkönä on pikseli, päätin sitten lätkäistä sen tohonkin. :P
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -Uusi "minidemo"

Post by Valtzu »

Hienolta näyttää.
SPuntte wrote:ainoa toteutustapa sille ovat Tyyppi-instanssit, jotka minun kokemukseni mukaan ovat herkkiä mysteerisille MAVeille.
Toinen mahdollinen toteutustapa olisi muistipalat (itse olen todennut toimiviksi), mutta niiden kanssa koodista tulee lähes väkisin melko vaikeaselkoista.
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -Uusi "minidemo"

Post by tuhoojabotti »

periaatteessa pisteet voisi tallentaa merkkijonoon x,y|x2,y2|... mutta sen parsiminen voisi olla hidasta...
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -Uusi "minidemo"

Post by SPuntte »

Noniin. Olen tässä taas raatanut yötä myöten uutta matskua.

Viimein olen saanut yhdistettyä polygonimoottorin ja fysiikkalogiikan pohjan + integraattoin yhteen pakettiin ja suunnilleen sellaiseen muotoon, millaisessa se tulevat lopullisessa kirjastossa olemaan. Tässä demossa, joka tosin ei ole interaktiivinen, liikkuu ja pyörii polygoneja ruudulla. Törmäykset puuttuvat edelleen.

Edelliseen verrattuna tämä versio on nyt siis purkaton mutta varmasti vieläkin hankalaselkoisempi. Plussaa on se, että säästytään käyttämästä ainuttakaan globaalia muuttujaa tai taulukkoa polygonien hallintaan. Yksi tyyppikokoelma on nyt paisunut kolmeksi ja polygonien käsipelipyöritelyn sijaan kappaleita liikutaa integraattori.

Oli jännää lähteä ajamaan koodia ensimmäistä kertaa, kun sitä oli naputellut muutaman tunnin, ja rivejä oli kertynyt reilu neljä ja puolisataa. Enhän minäkän ihan MAVeitta selvinnyt, mutta WaitKey-haarukoinnilla virheen sai paikannettua suht nopeasti. Eikä se muuten ollut edes kirjoitusvirhe :roll: Tosin eräs kirjoitusvirhe(joka menee copypasten piikkiin) aiheutti sen, ettei polygonit piirtyneet kunnolla. Jostain toistaiseksi tuntemattomasta syystä homma kuitenkin kusee vielä jostain kohtaa, sillä ihan silmämääräisesti näkee, että polygonien painopiste on järjestään väärässä kohdassa. Tutukin asiaa huomenna, nyt painun nukkumaan.

Koodit ovat niin pitkiä, etten viitsi niitä tähän postata, joten ne löytyvät linkkien takaa: Itse engine sekä tekemäni vektorimatematiikkakirjasto, joka tarvitaan ohjelman ajamiseen. Ja vielä laiskoille binääriä

Jos joku jaksaa auttaa minua projektin kanssa milläänkään tavalla, olen suuresti kiitollinen. Tällä hetkellä avuksi voi olla etsimällä tuota painopistebugia, optimoinnin varaa, tai muuten vaan benchmarkkaamalla. Itse saan nuhapumppukoneellani (CELERON III @ 500 MHz, 512M RAM) FPS ~15, kun kappaleita on tuo oletus 4 kipaletta..
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -tekniikkademo#2

Post by Ruuttu »

Mun koneella pyöri suht tasaisesti +-30 FPS. Outoa että ohjelma käyttää prosessorista vain noin puolet, vaikka prioriteetteja kuinka säätäisi. Itselläni on 2024Mb RAMia ja omituinen prosessori, jonka teho vaihtelee 994 ja 1800 Mhz välillä. Tänään CPU-Z ilmoitti prosessorini tehoksi sen suuremman. :D
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -tekniikkademo#2

Post by Dande »

FPS tasaisesti 25 Ubuntulla Winen päällä ajettuna (voin editoida tähän Windowsinkin antaman nopeuden, kunhan taas sen puolelle siirryn) Koneessa on AMD Athlon XP 2400 @ ~2,3GHz, 1024MB RAM

Lupaavaltahan tämä vaikuttaa

EDIT: Wintoosalla fps 31, ja kun siirsin framelimitin tarpeeksi korkealle, niin fps nousi 86
Last edited by Dande on Sun Aug 24, 2008 10:49 am, edited 2 times in total.
User avatar
KillBurn
Advanced Member
Posts: 339
Joined: Wed Aug 29, 2007 5:02 pm

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -tekniikkademo#2

Post by KillBurn »

Oma fps oli 31.Koneeni tehot on AMD64 3500+ 2048 MB RAM.
Tosi monipuoliselta jo vaikuttaa.
Sumu Games: Sam, Ur eye!
iTKEVAnAKKI
Advanced Member
Posts: 335
Joined: Tue Aug 28, 2007 3:55 pm
Location: Siellä jossain

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -tekniikkademo#2

Post by iTKEVAnAKKI »

Fps 31 ja kone: Turion64 x2 2000MHz, 3072MB RAM
Pysyi koko testin ajan tossa 31 :p
Projektit:
Joku projekti meneillään... Mitähän siitäkin tulee ;)
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: CoolPhysicsEngine - Fysiikkakirjasto CB:lle -tekniikkademo#2

Post by SPuntte »

Tarkoitus vähän niiq oli, että nostaisitte ton BODIES-vakion arvoa, jolloin laskettavaa tulee enemmän.. Eli älkää muuttako framelimittiä, vaan kokeilkaa, kuinka monta kappaletta voitte laittaa sinne killumaan, niin, että FPS ei laske alle 30:n :)

Ja tiedoksi, että tuo "respawn" on turhan raskas, koska siinä peräkkäin poistetaan kappale ja luodaan uusi, joten FPS notkahtelee siinä, jos on notkahtelevinaan. Oli vaan tarkotus, ettei se sylje koko ajan samoja kappaleita. Eli tuota outOfWindowCheck -funktiota muuttamalla sen saisi kymmenen kertaa kevyemmäksi, mutta sillon siinä pyörii sitten samat gonit.

Code: Select all

//Jos kappale on ruudun ulkopuolella, poistetaan nykyinen ja luodaan uusi
Function outOfWindowCheck(rBodyID%)
    rB.RIGID_BODY = ConvertToType(rBodyID%)
    tmpX# = getCompX(rB\posID%)
    tmpY# = getCompY(rB\posID%)
    bX# = SCRW/2 + 100
    bY# = SCRH/2 + 100
    If (tmpX# > bX#) Or (tmpX# < -bX#) Or (tmpY# > bY#) Or (tmpY# < -bY#) Then
        deleteBody(rB\ID%)
        rB.RIGID_BODY = ConvertToType(initBody(Rand(MINV,MAXV), Rnd(MINR, MAXR)))
    EndIf
    Return rB\ID%
EndFunction
-->

Code: Select all

//Jos kappale on ruudun ulkopuolella, poistetaan nykyinen ja luodaan uusi
Function outOfWindowCheck(rBodyID%)
    rB.RIGID_BODY = ConvertToType(rBodyID%)
    tmpX# = getCompX(rB\posID%)
    tmpY# = getCompY(rB\posID%)
    bX# = SCRW/2 + 100
    bY# = SCRH/2 + 100
    If (tmpX# > bX#) Or (tmpX# < -bX#) Or (tmpY# > bY#) Or (tmpY# < -bY#) Then
        setCompX(rB\posID%, 0)
        setCompY(rB\posID%, 0)
    EndIf
    Return rB\ID%
EndFunction
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

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