29.5.2013
Pitkästä aikaa päivytystä. Lisätty cpApplyGravitation, jolla voidaan luoda painovoima tietyn rungon kohdalle, niin että se vetää kaikkia toisia runkoja puoleensa. Korjattu muistipalasta ylikirjoitus cpShapeNewStaticissa. Päivitetty samalla chipmunk-physics versioon 6.1.4.
15.12.2011
Uusi versio julkaistu. Nyt mukana on (liian) kauan kaivattu manuaali, joka integroituu mukavasti CB:n editoriin. Muutama hyödyllinen funktio liitosten ominaisuuksien tarkistamiseen ja muuttamiseen mahdollistava mm. hajoavien liitosten tekemisen. Muutamat muutokset lähinnä dll:n kääntämisasetuksissa voivat tuoda (hyvin) vähän lisää vauhtia.
Muutoksena aikaisempaa tällä versiolla ennen cbChipmunkin includettamista täytyy määritellä chipmunkin käyttämän dll:n polku:
Code: Select all
Const CP_DLL_PATH = "cbChipmunk.dll"
12.1.2011
Pieniä päivityksiä aiempaan versioon. Lisätty mahdollisuus hakea törmäysten aiheuttama impulssi.
Isompana uudistuksena cpDebugDraw funktio, jonka avulla yhdellä funktion kutsulla saa piirrettyä koko fysiikkamaailman. Liitoksia ei vielä piirretä, mutta törmäysmuodot ja törmäyskohdat ainakin. Liitosten piirtäminen on tulossa cpDebugDrawiin seuraavassa päivityksessä.
Todo:
-Inertian laskenta funktiot [TEHTY] 3.8.2011
-Liitokset (Joint) [TEHTY (osittain)] 3.8.2011
-Polygonit [TEHTY] 5.8.2011
-Törmäysten hallinta [TEHTY] 24.9.2011
-Raycasting [TEHTY] 25.9.2011
-Lisää esimerkkejä (haluaako joku auttaa?)
-dokumentointi [TEHTY] 15.12.2011
-Fysiikkamaailman piirtäminen [tehty osittain] 12.1.2012
Projekti on nyt kaikkien nähtävillä GitHubissa. Jos joku halua auttaa, niin manuaalin teossa riittää hommaa. Editori sitä varten löytyy myös gitistä.
Kiitos JATothrimille ideasta käyttää Box2D:n sijasta Chipmunkia.
Vanha viesti:
Tälläistä on varmaan kaivattu jo pitkään, joten enemmittä puheitta esittelen teille cbChipmunk fysiikkakirjaston.
Se on tarkoitettu pelien 2d fysiikkan simulointiin. Tämä on kohtuullisen kesken eräinen, mutta kun vihdoin sain sen toimimaan jonkunlailla, niin oli heti pakko päästä esittelemään.
Perus rakenne
Kaikki fysiikka oliot perustuvat runkoihin. Rungoilla on sijainti, kulma ja nopeus, paino, inertia, sekä erilaisia voimia. Runkoihin kiinnitetään muotoja, jotka sitten voivat törmätä keskenään. Runko voi olla staattinen tai dynaaminen. Staattisiin runkoihin voi törmätä, mutta ne eivät liiku. Dynaamiset taas ovat tavallisia runkoja jotka voivat törmätä ja myös liikkuvat niiden vaikutuksesta.
Fysiikkamoottori on tehty pyörimään omassa säikeessään. Joten toiminta on tälläinen: Ensin kutsutaan cpUpdatea, se aloittaa fysiikan päivityksen. Kutsuttuasi sitä älä muuta runkoja. Tässä välissä kannattaa hoitaa vaikka piirtäminen. Sitten kutsutaan cpWaitForUpdatea, se odottaa kunnes fysiikat ovat päivitetty (yleensä ovat jo ennen kuin edes kutsutaan...).
Lopuksi pyydetään fysiikkamoottorilta uudet runkojen sijainnit, kulmat, nopeudet ja yms. Se tapahtuu kutsumalla cpPullAll. Eli pelin pääsilmukka kannattaisi olla suurinpiirtein tälläinen:
Kerrokset ja ryhmät
cbChipmunkissa törmäykset karsitaan kerrosten(layer) ja ryhmien(group) avulla. Kerrokset esitetään kokonaislukuna, jonka jokainen bitti tarkoitta yhtä kerrosta. Yksi muoto(cpShape) voi olla useammalla kerroksella yhtäaikaa (oletuksena kaikilla). Vain samalla kerroksella olevat muodot(cpShape) voivat törmätä.
Samaan ryhmään kuuluvat muodot eivät voi törmätä keskenään. Oletuksena muodolla ei ole ryhmää (ryhmä on 0:lla).
Polygonit
Chipmunk vaatii, että polygonit ovat kuperia, joten polygonin yksikään verteksi ei saa olla "kuopalla". Ja sitten verteksien täytyy olla myötäpäiväisessä järjestyksessä polygonissa. Jos ehdot eivät toteudu, niin luotaessa muotoa(cpShape) ohjelma herjaa "Invalid polygonia".
"Luokat"
Tällä hetkellä cbChipmunkissa on 7 "luokkaa" (muistipaloilla toimivat...) cpBody, cpShape, cpBoxGeometry, cpSegmentGeometry, cpCircleGeometry, cpArbiter ja cpArbiterList.
-*Geometry luokat pitävät sisällään tiedon muotojen geometrista. Niitä käytetään varsinaisen cpShapen luomiseen.
-cpShape on varsinainen muoto. Sillä on suhteellinen sijainti runkoonsa(cbBody) nähden. Sillä on kitka ja kimmoisuus.
-cpBody on fysiikka olioiden runko. Siihen liitetään muodot (cpShape).
-cpArbiter edustaa yhtä törmäystä. Siitä voidaan hakea törmäyksen toinen osapuoli(runko), sekä törmänneet muodot(cpShape) ja törmäyspisteet.
-cpArbiterList on lista törmäyksistä. Se on cpBodyGetArbiters funktion palautusarvo. Siitä voidaan hakea cpArbiterit.
Luokan jäsen luodaan [luokannimi]New funktiolla. Esim. cbBoxGeometryNew. cbBodyllä ja cpShapella on myös konstruktori funktiot staattisia jäseniä varten: cbBodyNewStatic ja cbShapeNewStatic. cbBodyStatic luo uuden staattisen rungon, ja cbShapeStatic luo uuden muodon ja kiinnittää sen cbChipmunkin päästaattiseen runkoon(se luodaan automaattisesti). Muodot ovat aina staattisia, kun ne kiinnitetään staattiseen runkoon.
Tällä hetkellä en ole vielä ehtinyt tehdä funktioita kaikkien luokkien ominaisuuksien muuttamiseen ja noutamiseen, joten ne täytyy tällä hetkellä hakea muistipalojen komennoilla. Ominaisuuksien hakemisen helpottamiseksi olen tehnyt kasan vakioita jotka kertovat missä kohdassa muistipalaa mikäkin tieto on. esim.
En ole ihan varma kannattaako edes funktioita tehdä, kun ylimääräisiä funktiokutsuja tulee aika paljon. (Kommentteja tästä kiitos)
Funktiot
(Tässä ei ole lähellekkään kaikki, mutta ehkä tärkeimmät)
Kaikki funktiot alkavat cp kirjainyhdistelmällä.
Yleiset
cpSetGravity(gravX#,gravY#)
-asettaa painovoiman.
cpSetIterations(iterations%)
-Asettaa montako kertaa fysiikat päivitetään per cpUpdate. Mikäli palikat tuntuvat menevän läpi muista palikoista, lisää tätä. Oletuksena 200.
cpDelete(var)
-Poistaa var:in. Tällä voidaan poistaa, mikä tahansa cp****New:llä luotu muuttuja. Huom. Jos poistat rungon, niin poistat samalla kaikki liitokset ja muodot jotka siihen on kiinnitetty. cpShapen poistaminen ei poista cb****Geometryä.
cpPush(var)
-Tyrkkää var:iin tehdyt muutokset takaisin fysiikkamoottorille. Käytä tätä sen jälkeen, kun olet muuttanut vaikka rungon sijaintia. Toimii cpBodyllä ja cpShapella. Huom. jos tyrkkäät cpShapen, niin ainoastaan kitka, kimmoisuus, ryhmä ja kerrokset päivittyvät.
cpUpdate(step#)
-aloittaa fysiikoiden päivittämisen ja päivittäää fysiikoita step# sekuntia. Kannattaa käyttää aina samaa lukua. Se kuuluisi olla sama kuin FPS joten step# kannattaa olla 1.0/FrameLimit.
cpWaitForUpdate()
-odottaa kunnes fysiikat ovat päivittyneet tai palaa suoraan mikäli ovat jo. Palauttaa nyt, montako millisekuntia kului varsinaiseen fysiikan päivitykseen.
cpPullAll()
-hakee kaikkien runkojen(cpBody) päivitetyt tiedot. Kutsu tätä cbWaitForUpdaten jälkeen.
cpUseSpatialHash(width#,size)
-Tällä saat chipmunkin käyttämään ruudukkoa puun sijaan törmäysten järjestelemiseen. Jos kentässä on paljon saman kokoisia muotoja niin tätä kannattaa ehdottomasti käyttää. Ruudunleveys(width#) kannattaa olla lähellä keskimääräistä muodon kokoa ja taulukon solujen määrä(size) kannattaa olla noin 10*runkojen määrä. (Nuo suositukset ovat Chipmunkin dokumentaatiosta otettuja...)
cpSetSleepTimeThreshold(t#)
-Tällä voi asettaa ajan, jonka rungon täytyy pysyä paikallaan, että se nukahtaa.
cpIdleSpeedThreshold(s#)
-Tällä voit asettaa paljonko runko saa liikkua, että se tulkitaa paikallaan olevaksi(katso ylempi).
cpSetDamping(v#)
-Tällä voit asettaa paljonko runkojen liike hidastuu.
Geometriset muodot
cpBoxGeometryNew(w#,h#)
-luo uuden laatikon jonka koko on w# x h#
cpCircleGeometryNew(r#,r2# = 0)
-luo uuden ympyrän jonka säde on r#. Jos haluat tehdä kehän ympyrän sijasta muuta r2:n arvoa, mutta se vaikuttaa vain inertian ja massan laskentaan.
cpSegmentGeometryNew(x1#,y1#,x2#,y2#,w#)
-luo uuden viivan pisteiden (x1#,y1#) ja (x2#,y2#) välille. Viivan paksuus on w#. Käytä viivoja mieluusti vain staattisissa rungoissa.
cpPolyGeometryNew(size)
-luo uuden polygonin "size" määrällä pisteitä
cpPolyGeometrySetVertex(polygon,index,x#,y#)
-asettaa polygonin "polygon" verteksin indeksistä (index) sijainniksi (x#,y#). Indeksi alkaa 0:llasta ja päättyy koko-1:een.
cpPolyGeometryRecenter(polygon)
-keskittää polygonin painopisteeseensä. Käytä tätä, kun olet saannut polygonin muodon valmiiksi.
cpMomentForGeometry(geometry,mass#,offsetX# = 0,offsetY# = 0)
-Laskee inertian muodolle geometry(mikätahansa cpGeometry* (circle/segment/box))
cpAreaForGeometry(geometry)
-Laskee pinta-alan muodolle geometry(mikätahansa cpGeometry* (circle/segment/box))
Rungot
cpBodyNew(mass#,inertia#,x# = 0,y# = 0)
-luo uuden rungon jonka massa on mass# ja inertia on inertia# ja asettaa sen paikkaan (x#,y#)
cpBodyNewStatic(x# = 0,y# = 0)
-luo uuden staattisen rungon ja asettaa sen paikkaan (x#,y#)
cpApplyForce(body,fx#,fx#,px#,py#)
-Lisää rungolle (fx#,fy#) voiman, pisteestä rungon suhteen suhteellisesta pisteestä (px#,py#).
cpApplyImpulse(body,fx#,fx#,px#,py#)
-Lisää rungolle (fx#,fy#) impulssin, pisteestä rungon suhteen suhteellisesta pisteestä (px#,py#).
cpApplyTorque(body,torque#)
-Kääntää runkoa väännöllä torque#. Positiivinen torque# pyörittää myötäpäivään ja negatiivinen vastapäivään.
cpBodySetPos(body,x#,y#)
-Siirtää rungon body pisteeseen (x#,y#). Kutsu tämän jälkeen cpPushia, että muutokset päivittyvät fysiikkamoottorille.
cpBodySetAngle(body,ang#)
-Kääntää rungon body kulmaan ang#. Kutsu tämän jälkeen cpPushia, että muutokset päivittyvät fysiikkamoottorille.
cpBodyWorldToLocal(body,x#,y#)
-muuttaa maailmakoordinaatit rungon suhteellisiksi koordinaateiksi. Tallentaa muunnetut koordinaatit muuttujiin CP_GLOBAL_X ja CP_GLOBAL_Y
cpBodyLocalToWorld(body,x#,y#)
-muuttaa rungon suhteelliset koordinaatit maailmakoordinaateiksi. Tallentaa muunnetut koordinaatit muuttujiin CP_GLOBAL_X ja CP_GLOBAL_Y
Törmäysmuodot
cpShapeNew(body,geometry,layers = CP_LAYER_ALL,group = CP_NO_GROUP,offsetVecX# = 0,offsetVecY# = 0,friction# = 0.7,restitution# = 0.3)
-luo uuden muodon rungolle body. Käyttää muotona geometryä (kats. esim. cpCircleGeometry). Asettaa muodon kerrokselle layer ja omaan ryhmään group (Oletuksena omaan ryhmäänsä). Asettaa suhteelliseksi sijainniksi rungosta (offsetVecx#,offsetVecY#). Asettaa kitkaksi friction ja kimmoisuudeksi restitution.
cpShapeNewStatic(geometry,layers = CP_LAYER_ALL,group = CP_NO_GROUP,offsetVecX# = 0,offsetVecY# = 0,friction# = 0.7,restitution# = 0.3)
-luo uuden muodon ja liittää sen päästaattiseen runkoon. Kats. cpShapeNew.
cpShapeUnderPoint(x#,y#,layers = CP_LAYER_ALL,group = CP_NO_GROUP)
-Palautaa muodon (cpShape), joka on pisteen(x#,y#) alla. Etsintä suoritetaan kerroksilla layers ja ryhmässä group.
Liitokset
cpSlideJointNew(body1,body2,mimD#,maxD#,p1x#,p1y#,p2x#,p2y#
Luo uuden "sylinterin" body1 ja body2:n välille. Sen maksimipituus on maxD# ja minimi minD#. "Sylinteri" on liitetty body1:een kohdasta (p1x#,p1y#) (suhteellinen body1:n sijaintiin).
cpRotaryLimitJointNew(body1,body2,minR#,maxR#)
Luo rajoittimen kahden rungon kulmien erotukselle. Eli body1:n kulman ja body2:n kulman erotus pitää olla suurempi kuin minR ja pienempi kuin maxR#
cpPinJointNew(body1,body2,p1x#,p1y#,p2x#,p2y#)
Luo "tangon" body1:n ja body2:n välille, pisteestä (p1x#,p1y#) pisteeseen (p2x#,p2y#). Huomaa, että tagon pituus riippuu runkojen paikasta liitoksen teko hetkellä.
Törmäysten hakeminen
cpEnableContactGraph(enable)
-Valitsee tallennetaanko törmäyksiä. Oletuksena ei.
cpBodyGetArbiters(body)
-Palauttaa listan törmäyksistä. Mikäli törmäyksiä ei ole palautetaan nolla.
cpArbiterListSize(arbiterList)
-Palauttaa törmäyslistan koon eli montako törmäystä se sisältää.
cpArbiterListGet(arbiterList,i)
-Palauttaa törmäyslistasta i:nen törmäyksen(cpArbiter). Ensimmäisen jäsenen sijainti on 0, toisen 1 jne.
cpArbiterCountCollisionPoints(arbiter)
-Laskee montako törmäyspistettä törmäys sisältää ja palauttaa sen.
cpArbiterGetCollisionPointX(arbiter,i)
-Palauttaa törmäyksen arbiter i:nen törmäyspisteen x-sijainnin maailmakoordinaateissa.
cpArbiterGetCollisionPointY(arbiter,i)
-Palauttaa törmäyksen arbiter i:nen törmäyspisteen y-sijainnin maailmakoordinaateissa.
cpArbiterGetBody1(arbiter)
-Palauttaa rungon, joka törmäsi. Sama runko, mikä annettiin cpBodyGetArbiters funktiolle.
cpArbiterGetBody2(arbiter)
-Palauttaa rungon, johon cpBodyGetArbiters funktiolle annettu runko törmäsi.
cpArbiterGetShape1(arbiter)
-Palauttaa cpBodyGetArbiters funktiolle annetun rungon muodon, joka törmäsi.
cpArbiterGetShape2(arbiter)
-Palauttaa muodon johon cpBodyGetArbiters funktiolle annettu runko törmäsi.
cpDeleteArbiterList(arbiterlist)
-Poistaa törmäyslistan ja kaikki sen jäsenet. Muista tehdä tämä!!!
Raycasting
cpShapeUnderSegment(shape,x1,y1,x2,y2)
-Tarkistaa onko shape liivan (x1,y1):stä (x2,y2):een alla. Palauttaa 1 mikäli on ja 0 mikäli ei. Osuman normaalivektorin saa CP_GLOBAL_NORMAL_X:n ja CP_GLOBAL_NORMAL_Y:n avulla. Osumakohdan etäisyyden viivan alkupisteestä saa CP_GLOBAL_DISTANCE:sesta, jonka arvo on väliltä 0.0-1.0
cpSegmentQueryFirst(x1,y1,x2,y2,layers = -1,group = 0)
-Palauttaa ensimmäisen muodon(cpShape), johon viiva osuu. Mikäli yhtää muotoa ei ole viivalla palautetaan 0:lla. Osuman normaalivektorin saa CP_GLOBAL_NORMAL_X:n ja CP_GLOBAL_NORMAL_Y:n avulla. Osumakohdan etäisyyden viivan alkupisteestä saa CP_GLOBAL_DISTANCE:sesta, jonka arvo on väliltä 0.0-1.0
cpSegmentQuery(x1,y1,x2,y2,layers = CP_LAYERS_ALL,group = CP_NO_GROUP)
-Etsii kaikki muodot jotka ovat viivan (x1,y1):stä (x2,y2):een välillä. Palauttaa 0, jos yhtää muotoa ei ollut liivalla, muulloin palauttaa cpSegmentQueryResultin.
cpSegmentQueryResult
cpQueryCountHits(query)
-Palauttaa montako osumaa.
cpQueryGetShape(query,i)
-Palauttaa i:nen osutun muodon
cpQueryGetDistance(query,i)
-Palauttaa i:nen osuman osumakohdan etäisyyden viivan alkupisteestä. Palautettu luku on väliltä 0.0-1.0
cpQueryGetNormalX(query,i)
-Palauttaa i:nen osuman normaalivektorin x arvon.
cpQueryGetNormalY(query,i)
-Palauttaa i:nen osuman normaalivektorin y arvon.
Se on tarkoitettu pelien 2d fysiikkan simulointiin. Tämä on kohtuullisen kesken eräinen, mutta kun vihdoin sain sen toimimaan jonkunlailla, niin oli heti pakko päästä esittelemään.
Perus rakenne
Kaikki fysiikka oliot perustuvat runkoihin. Rungoilla on sijainti, kulma ja nopeus, paino, inertia, sekä erilaisia voimia. Runkoihin kiinnitetään muotoja, jotka sitten voivat törmätä keskenään. Runko voi olla staattinen tai dynaaminen. Staattisiin runkoihin voi törmätä, mutta ne eivät liiku. Dynaamiset taas ovat tavallisia runkoja jotka voivat törmätä ja myös liikkuvat niiden vaikutuksesta.
Fysiikkamoottori on tehty pyörimään omassa säikeessään. Joten toiminta on tälläinen: Ensin kutsutaan cpUpdatea, se aloittaa fysiikan päivityksen. Kutsuttuasi sitä älä muuta runkoja. Tässä välissä kannattaa hoitaa vaikka piirtäminen. Sitten kutsutaan cpWaitForUpdatea, se odottaa kunnes fysiikat ovat päivitetty (yleensä ovat jo ennen kuin edes kutsutaan...).
Lopuksi pyydetään fysiikkamoottorilta uudet runkojen sijainnit, kulmat, nopeudet ja yms. Se tapahtuu kutsumalla cpPullAll. Eli pelin pääsilmukka kannattaisi olla suurinpiirtein tälläinen:
Code: Select all
Repeat
cpUpdate(1.0/60.0)
//Kaikki piirtäminen tähän...
DrawScreen
cpWaitForUpdate()
cpPullAll()
Forever
cbChipmunkissa törmäykset karsitaan kerrosten(layer) ja ryhmien(group) avulla. Kerrokset esitetään kokonaislukuna, jonka jokainen bitti tarkoitta yhtä kerrosta. Yksi muoto(cpShape) voi olla useammalla kerroksella yhtäaikaa (oletuksena kaikilla). Vain samalla kerroksella olevat muodot(cpShape) voivat törmätä.
Samaan ryhmään kuuluvat muodot eivät voi törmätä keskenään. Oletuksena muodolla ei ole ryhmää (ryhmä on 0:lla).
Polygonit
Chipmunk vaatii, että polygonit ovat kuperia, joten polygonin yksikään verteksi ei saa olla "kuopalla". Ja sitten verteksien täytyy olla myötäpäiväisessä järjestyksessä polygonissa. Jos ehdot eivät toteudu, niin luotaessa muotoa(cpShape) ohjelma herjaa "Invalid polygonia".
"Luokat"
Tällä hetkellä cbChipmunkissa on 7 "luokkaa" (muistipaloilla toimivat...) cpBody, cpShape, cpBoxGeometry, cpSegmentGeometry, cpCircleGeometry, cpArbiter ja cpArbiterList.
-*Geometry luokat pitävät sisällään tiedon muotojen geometrista. Niitä käytetään varsinaisen cpShapen luomiseen.
-cpShape on varsinainen muoto. Sillä on suhteellinen sijainti runkoonsa(cbBody) nähden. Sillä on kitka ja kimmoisuus.
-cpBody on fysiikka olioiden runko. Siihen liitetään muodot (cpShape).
-cpArbiter edustaa yhtä törmäystä. Siitä voidaan hakea törmäyksen toinen osapuoli(runko), sekä törmänneet muodot(cpShape) ja törmäyspisteet.
-cpArbiterList on lista törmäyksistä. Se on cpBodyGetArbiters funktion palautusarvo. Siitä voidaan hakea cpArbiterit.
Luokan jäsen luodaan [luokannimi]New funktiolla. Esim. cbBoxGeometryNew. cbBodyllä ja cpShapella on myös konstruktori funktiot staattisia jäseniä varten: cbBodyNewStatic ja cbShapeNewStatic. cbBodyStatic luo uuden staattisen rungon, ja cbShapeStatic luo uuden muodon ja kiinnittää sen cbChipmunkin päästaattiseen runkoon(se luodaan automaattisesti). Muodot ovat aina staattisia, kun ne kiinnitetään staattiseen runkoon.
Tällä hetkellä en ole vielä ehtinyt tehdä funktioita kaikkien luokkien ominaisuuksien muuttamiseen ja noutamiseen, joten ne täytyy tällä hetkellä hakea muistipalojen komennoilla. Ominaisuuksien hakemisen helpottamiseksi olen tehnyt kasan vakioita jotka kertovat missä kohdassa muistipalaa mikäkin tieto on. esim.
Code: Select all
rungonX = PeekFloat(runko,CP_INDEX_BODY_POS_X)
Funktiot
(Tässä ei ole lähellekkään kaikki, mutta ehkä tärkeimmät)
Kaikki funktiot alkavat cp kirjainyhdistelmällä.
Yleiset
cpSetGravity(gravX#,gravY#)
-asettaa painovoiman.
cpSetIterations(iterations%)
-Asettaa montako kertaa fysiikat päivitetään per cpUpdate. Mikäli palikat tuntuvat menevän läpi muista palikoista, lisää tätä. Oletuksena 200.
cpDelete(var)
-Poistaa var:in. Tällä voidaan poistaa, mikä tahansa cp****New:llä luotu muuttuja. Huom. Jos poistat rungon, niin poistat samalla kaikki liitokset ja muodot jotka siihen on kiinnitetty. cpShapen poistaminen ei poista cb****Geometryä.
cpPush(var)
-Tyrkkää var:iin tehdyt muutokset takaisin fysiikkamoottorille. Käytä tätä sen jälkeen, kun olet muuttanut vaikka rungon sijaintia. Toimii cpBodyllä ja cpShapella. Huom. jos tyrkkäät cpShapen, niin ainoastaan kitka, kimmoisuus, ryhmä ja kerrokset päivittyvät.
cpUpdate(step#)
-aloittaa fysiikoiden päivittämisen ja päivittäää fysiikoita step# sekuntia. Kannattaa käyttää aina samaa lukua. Se kuuluisi olla sama kuin FPS joten step# kannattaa olla 1.0/FrameLimit.
cpWaitForUpdate()
-odottaa kunnes fysiikat ovat päivittyneet tai palaa suoraan mikäli ovat jo. Palauttaa nyt, montako millisekuntia kului varsinaiseen fysiikan päivitykseen.
cpPullAll()
-hakee kaikkien runkojen(cpBody) päivitetyt tiedot. Kutsu tätä cbWaitForUpdaten jälkeen.
cpUseSpatialHash(width#,size)
-Tällä saat chipmunkin käyttämään ruudukkoa puun sijaan törmäysten järjestelemiseen. Jos kentässä on paljon saman kokoisia muotoja niin tätä kannattaa ehdottomasti käyttää. Ruudunleveys(width#) kannattaa olla lähellä keskimääräistä muodon kokoa ja taulukon solujen määrä(size) kannattaa olla noin 10*runkojen määrä. (Nuo suositukset ovat Chipmunkin dokumentaatiosta otettuja...)
cpSetSleepTimeThreshold(t#)
-Tällä voi asettaa ajan, jonka rungon täytyy pysyä paikallaan, että se nukahtaa.
cpIdleSpeedThreshold(s#)
-Tällä voit asettaa paljonko runko saa liikkua, että se tulkitaa paikallaan olevaksi(katso ylempi).
cpSetDamping(v#)
-Tällä voit asettaa paljonko runkojen liike hidastuu.
Geometriset muodot
cpBoxGeometryNew(w#,h#)
-luo uuden laatikon jonka koko on w# x h#
cpCircleGeometryNew(r#,r2# = 0)
-luo uuden ympyrän jonka säde on r#. Jos haluat tehdä kehän ympyrän sijasta muuta r2:n arvoa, mutta se vaikuttaa vain inertian ja massan laskentaan.
cpSegmentGeometryNew(x1#,y1#,x2#,y2#,w#)
-luo uuden viivan pisteiden (x1#,y1#) ja (x2#,y2#) välille. Viivan paksuus on w#. Käytä viivoja mieluusti vain staattisissa rungoissa.
cpPolyGeometryNew(size)
-luo uuden polygonin "size" määrällä pisteitä
cpPolyGeometrySetVertex(polygon,index,x#,y#)
-asettaa polygonin "polygon" verteksin indeksistä (index) sijainniksi (x#,y#). Indeksi alkaa 0:llasta ja päättyy koko-1:een.
cpPolyGeometryRecenter(polygon)
-keskittää polygonin painopisteeseensä. Käytä tätä, kun olet saannut polygonin muodon valmiiksi.
cpMomentForGeometry(geometry,mass#,offsetX# = 0,offsetY# = 0)
-Laskee inertian muodolle geometry(mikätahansa cpGeometry* (circle/segment/box))
cpAreaForGeometry(geometry)
-Laskee pinta-alan muodolle geometry(mikätahansa cpGeometry* (circle/segment/box))
Rungot
cpBodyNew(mass#,inertia#,x# = 0,y# = 0)
-luo uuden rungon jonka massa on mass# ja inertia on inertia# ja asettaa sen paikkaan (x#,y#)
cpBodyNewStatic(x# = 0,y# = 0)
-luo uuden staattisen rungon ja asettaa sen paikkaan (x#,y#)
cpApplyForce(body,fx#,fx#,px#,py#)
-Lisää rungolle (fx#,fy#) voiman, pisteestä rungon suhteen suhteellisesta pisteestä (px#,py#).
cpApplyImpulse(body,fx#,fx#,px#,py#)
-Lisää rungolle (fx#,fy#) impulssin, pisteestä rungon suhteen suhteellisesta pisteestä (px#,py#).
cpApplyTorque(body,torque#)
-Kääntää runkoa väännöllä torque#. Positiivinen torque# pyörittää myötäpäivään ja negatiivinen vastapäivään.
cpBodySetPos(body,x#,y#)
-Siirtää rungon body pisteeseen (x#,y#). Kutsu tämän jälkeen cpPushia, että muutokset päivittyvät fysiikkamoottorille.
cpBodySetAngle(body,ang#)
-Kääntää rungon body kulmaan ang#. Kutsu tämän jälkeen cpPushia, että muutokset päivittyvät fysiikkamoottorille.
cpBodyWorldToLocal(body,x#,y#)
-muuttaa maailmakoordinaatit rungon suhteellisiksi koordinaateiksi. Tallentaa muunnetut koordinaatit muuttujiin CP_GLOBAL_X ja CP_GLOBAL_Y
cpBodyLocalToWorld(body,x#,y#)
-muuttaa rungon suhteelliset koordinaatit maailmakoordinaateiksi. Tallentaa muunnetut koordinaatit muuttujiin CP_GLOBAL_X ja CP_GLOBAL_Y
Törmäysmuodot
cpShapeNew(body,geometry,layers = CP_LAYER_ALL,group = CP_NO_GROUP,offsetVecX# = 0,offsetVecY# = 0,friction# = 0.7,restitution# = 0.3)
-luo uuden muodon rungolle body. Käyttää muotona geometryä (kats. esim. cpCircleGeometry). Asettaa muodon kerrokselle layer ja omaan ryhmään group (Oletuksena omaan ryhmäänsä). Asettaa suhteelliseksi sijainniksi rungosta (offsetVecx#,offsetVecY#). Asettaa kitkaksi friction ja kimmoisuudeksi restitution.
cpShapeNewStatic(geometry,layers = CP_LAYER_ALL,group = CP_NO_GROUP,offsetVecX# = 0,offsetVecY# = 0,friction# = 0.7,restitution# = 0.3)
-luo uuden muodon ja liittää sen päästaattiseen runkoon. Kats. cpShapeNew.
cpShapeUnderPoint(x#,y#,layers = CP_LAYER_ALL,group = CP_NO_GROUP)
-Palautaa muodon (cpShape), joka on pisteen(x#,y#) alla. Etsintä suoritetaan kerroksilla layers ja ryhmässä group.
Liitokset
cpSlideJointNew(body1,body2,mimD#,maxD#,p1x#,p1y#,p2x#,p2y#
Luo uuden "sylinterin" body1 ja body2:n välille. Sen maksimipituus on maxD# ja minimi minD#. "Sylinteri" on liitetty body1:een kohdasta (p1x#,p1y#) (suhteellinen body1:n sijaintiin).
cpRotaryLimitJointNew(body1,body2,minR#,maxR#)
Luo rajoittimen kahden rungon kulmien erotukselle. Eli body1:n kulman ja body2:n kulman erotus pitää olla suurempi kuin minR ja pienempi kuin maxR#
cpPinJointNew(body1,body2,p1x#,p1y#,p2x#,p2y#)
Luo "tangon" body1:n ja body2:n välille, pisteestä (p1x#,p1y#) pisteeseen (p2x#,p2y#). Huomaa, että tagon pituus riippuu runkojen paikasta liitoksen teko hetkellä.
Törmäysten hakeminen
cpEnableContactGraph(enable)
-Valitsee tallennetaanko törmäyksiä. Oletuksena ei.
cpBodyGetArbiters(body)
-Palauttaa listan törmäyksistä. Mikäli törmäyksiä ei ole palautetaan nolla.
cpArbiterListSize(arbiterList)
-Palauttaa törmäyslistan koon eli montako törmäystä se sisältää.
cpArbiterListGet(arbiterList,i)
-Palauttaa törmäyslistasta i:nen törmäyksen(cpArbiter). Ensimmäisen jäsenen sijainti on 0, toisen 1 jne.
cpArbiterCountCollisionPoints(arbiter)
-Laskee montako törmäyspistettä törmäys sisältää ja palauttaa sen.
cpArbiterGetCollisionPointX(arbiter,i)
-Palauttaa törmäyksen arbiter i:nen törmäyspisteen x-sijainnin maailmakoordinaateissa.
cpArbiterGetCollisionPointY(arbiter,i)
-Palauttaa törmäyksen arbiter i:nen törmäyspisteen y-sijainnin maailmakoordinaateissa.
cpArbiterGetBody1(arbiter)
-Palauttaa rungon, joka törmäsi. Sama runko, mikä annettiin cpBodyGetArbiters funktiolle.
cpArbiterGetBody2(arbiter)
-Palauttaa rungon, johon cpBodyGetArbiters funktiolle annettu runko törmäsi.
cpArbiterGetShape1(arbiter)
-Palauttaa cpBodyGetArbiters funktiolle annetun rungon muodon, joka törmäsi.
cpArbiterGetShape2(arbiter)
-Palauttaa muodon johon cpBodyGetArbiters funktiolle annettu runko törmäsi.
cpDeleteArbiterList(arbiterlist)
-Poistaa törmäyslistan ja kaikki sen jäsenet. Muista tehdä tämä!!!
Raycasting
cpShapeUnderSegment(shape,x1,y1,x2,y2)
-Tarkistaa onko shape liivan (x1,y1):stä (x2,y2):een alla. Palauttaa 1 mikäli on ja 0 mikäli ei. Osuman normaalivektorin saa CP_GLOBAL_NORMAL_X:n ja CP_GLOBAL_NORMAL_Y:n avulla. Osumakohdan etäisyyden viivan alkupisteestä saa CP_GLOBAL_DISTANCE:sesta, jonka arvo on väliltä 0.0-1.0
cpSegmentQueryFirst(x1,y1,x2,y2,layers = -1,group = 0)
-Palauttaa ensimmäisen muodon(cpShape), johon viiva osuu. Mikäli yhtää muotoa ei ole viivalla palautetaan 0:lla. Osuman normaalivektorin saa CP_GLOBAL_NORMAL_X:n ja CP_GLOBAL_NORMAL_Y:n avulla. Osumakohdan etäisyyden viivan alkupisteestä saa CP_GLOBAL_DISTANCE:sesta, jonka arvo on väliltä 0.0-1.0
cpSegmentQuery(x1,y1,x2,y2,layers = CP_LAYERS_ALL,group = CP_NO_GROUP)
-Etsii kaikki muodot jotka ovat viivan (x1,y1):stä (x2,y2):een välillä. Palauttaa 0, jos yhtää muotoa ei ollut liivalla, muulloin palauttaa cpSegmentQueryResultin.
cpSegmentQueryResult
cpQueryCountHits(query)
-Palauttaa montako osumaa.
cpQueryGetShape(query,i)
-Palauttaa i:nen osutun muodon
cpQueryGetDistance(query,i)
-Palauttaa i:nen osuman osumakohdan etäisyyden viivan alkupisteestä. Palautettu luku on väliltä 0.0-1.0
cpQueryGetNormalX(query,i)
-Palauttaa i:nen osuman normaalivektorin x arvon.
cpQueryGetNormalY(query,i)
-Palauttaa i:nen osuman normaalivektorin y arvon.