ezbe wrote:CoolBasic Classic pelimaailman parannuksia
Tässä pikaisesti kasattua selitystä kuvan pohjalta ja
scenegraph/monikamera-systeemeistä yleisesti:
Renderöintimoottoria on taas puskettu jonkun matkaa eteenpäin.
Kuvakaappaus on useampaa kameraa käyttävästä testiohjelmasta, jossa on
myös käytössä nk. "scene graph", eli hierarkinen malli. Yksi
tyypillisimmistä esimerkeistä hierarkisesta mallista on
tähtijärjestelmä, joka siis tässäkin kuvassa näkyy. Tämä postaus ei
selitä juurta jaksain hierarkisen mallin yksityiskohtia, mikäli aihe
kiinnostaa, googlella löytynee läjittäin tarkempia kuvauksia ja
esimerkkejä.
Vasemman yläkulman kamera on kiinnitetty pelaajan alukseen, jolloin se
kääntyy aluksen mukana ja seuraa sitä automaattisesti. Vasemman
alakulman kameran kiinnitystä vaihdetaan aluksen liikkuessa aina
alusta lähimpään planeettaan. Oikean alakulman kamera näyttää kauas
zoomattua kameraa, joka on sijoitettu tähtijärjestelmän keskelle.
Oikean yläkulman kamera käyttää samanlaista näkymää, mutta sen päälle
on vielä piirretty viivoilla tähtijärjestelmän hierarkia (scenegraph).
Lyhyesti ja osittain puutteellisesti selitettynä, keskustähti on
hierarkiassa ylimpänä, johon planeetat on kytketty, ja planeettoihin
taas on liitetty kuita. Näiden välissä on vielä näkymättömiä
objekteja, jotta kuita ja planeettoja voidaan pyörittää paikallisen
akselin ympäri eri nopeuksilla.
Scene graph / objektihierarkia
Objekteja voidaan liittää ("parentoida") toisiinsa niin, että objektin
"lapset" liikkuvat "vanhemman" mukana. Käytännössä objektien
liittämisestä seuraa se, että lapsiobjektin sijainti ja rotaatio
ilmoitetaan sekä asetetaan suhteessa vanhempaan, eikä
"maailmankoordinaateissa", kuten "orvoilla" (ei vanhempaa)
objekteilla. Hierarkiaketju toimii "alaspäin", eli vanhemman
siirtäminen tai kääntäminen vaikuttaa kaikkiin sen lapsiin,
lastenlapsiin ja niin edelleen. Lapsiobjektin siirto tai rotatointi
kuitenkaan ei vaikuta vanhempaan, mutta jälleen kaikkiin kyseisen
objektin lapsiin. Esimerkkinä voitaisiin ottaa panssarivaunu, joka
koostuu kahdesta eri osasta: runko ja torni. Torni on rungon lapsi,
jolloin runkoa liikutettaessa ja käännettäessä torni liikkuu ja
kääntyy mukana. Tornia voidaan kuitenkin pyörittää riippumatta
rungosta, eli se a) liikkuu automaattisesti runkoa liikutettaessa, b)
kääntyy automaattisesti rungon kääntyessä ja c) sitä voidaan kääntää
(tai vaikka liikuttaa) itsenäisesti. Käännöissä on syytä ottaa
huomioon, että kääntö on suhteessa rungon asentoon, jolloin saattaa
olla tarpeen ottaa koordinaatistomuutokset huomioon
(tykki->runko->maailma). Joitakin apukomentoja esimerkiksi objektin
suunnan ja sijainnin määrittämiseen suhteessa maailmankoordinaatiston
akseleihin ja origoon tullaan hyvin todennäköisesti tarvitsemaan,
joten sellaisetkin toki tarjotaan. Mikään pakko hierarkista
järjestelmää ei ole käyttää, vaan halutessa objektit voidaan aina
sijoittaa yksinkertaisti suhteessa maailmankoordinaatistoon ja ilman
hierarkiasuhteita.
Monen kameran tuki
Testiohjelmassa ruutu on jaettu neljälle eri kameralle. Kameroille
määritellään alue, eli viewport, johon ne näytöllä piirtävät (alueet
voivat olla eri kokoisia, ruutua ei ole pakko jakaa saman kokoisiin
alueisiin tai edes käyttää kokonaan). Kamerat ovat "objekteja"
(peliobjekteja) siinä missä kaikki muutkin, joskaan tietyt komennot
(kuten ObjectOrder, tai mikä sitä tuleekaan vastaamaan) eivät ole
järkeviä kameran tapauksessa, eivätkä täten tule siihen vaikuttamaan.
Suurin osa (ellei kaikki) ruutukoordinaattien mukaan toimivista
piirtokomennoista tulevat olemaan "kamerakohtaisia". Tämä tarkoittaa,
että esimerkiksi viiva pisteestä 0,0 pisteeseen 100,100 piirretään
kameran viewportin mukaan, ei suoraan näytön koordinaatiston mukaan.
Tietysti jos käytössä on koko näytön alueen käyttävä kamera, vastaavat
kamerakoordinaatit näyttökoordinaatteja.
Kameroiden näkemää aluetta voidaan piirtää näytölle yksi ("nykyinen")
kamera kerrallaan, asettamalla halutut kamerat "aktiivisiksi" ja
käskemällä runtime-moottoria piirtämään kaikki aktiiviset kamerat, tai
näitä yhdistelemällä: esim. piirrä kaikki aktiiviset kamerat (jos
vaikkapa kamerat 1 ja 3 olisi asetettu aktiivisiksi), tee jotain muuta
välissä ja piirrä kamera 2 jne. Kameroiden yksittäispiirrosta
hyödytään myös siinä tapauksessa, että käyttäjä haluaisi useampia
täyden ruudun kameroita, joiden välillä voidaan vaihdella. Näin
ohjelmassa voisi olla vaikkapa kaksi eri täyden ruudun kameraa, mutta
vain jompaa kumpaa piirrettäisiin kerrallaan, ja kameroiden välillä
voisi vaihtaa tuhoamatta toista välissä.
Kamerajärjestelmästä olisi mukava kuulla kommentteja, tätä(kään) osaa
moottorista ei ole vielä lyöty täysin lukkoon, joten mikäli tunnet
keksineesi jonkin hyvän ominaisuuden (tai paremman tavan kontrolloida
kameroita ylipäätään), kerro toki meille.