Miten olisi järkevää toteuttaa taivas 3D-pelissä? Pitääkö tehdä iso objekti kaukaisuuteen ja teksturoida taivaan näköiseksi, vai onko jokin kätevämpi keino? Tuolla konstillakin periaatteessa olisi mahdollista kulkea taivaan läpi, koska se olisi vain objekti muiden joukossa, mutta iso ja kaukana. Eikä se minun kokeilujeni perusteella ole kovin uskottavan näköinenkään...
eiks sitä vois tehä tälläin härösti, että esim maa, jolla kävellään on objekti ja sit kaiken tausta on just se taivas, jonka eteen vain piirretään objekteja! :o
Luulisi olevan aika helppo eikä kovin raskas ainakaan.
(joo ajattelen kuitenkin ihan väärin huomauttakaa vaan)
muoks. se tosin olis varmaan aika staattisen näkönen mut joo... ;) tai voihan siitä tehä tietenkin kerralla näkyvää ruutua isomman, jolloin vois saada aikaan oikein nätin näkösen ja helpon taivaan
Hm, tuli itselleni muuan tapa toteuttaa taivas. Aluksi kuvitellaan että pelaajan hahmo on pallon sisällä. Pallon sisäpinnassa on taivastekstuuri. Kun hahmoa liikuttaa, liikkuu tuo pallo. Luonnollisesti näkymän peittää esim. mikä tahansa objekti, tai vastaava..
-Grey-
Grey kirjoitti:
Hm, tuli itselleni muuan tapa toteuttaa taivas. Aluksi kuvitellaan että pelaajan hahmo on pallon sisällä. Pallon sisäpinnassa on taivastekstuuri. Kun hahmoa liikuttaa, liikkuu tuo pallo. Luonnollisesti näkymän peittää esim. mikä tahansa objekti, tai vastaava..
-Grey-
Njoo, tuo lienee parhaiten toimiva ratkaisu. Se pallo tosin tullee olemaan aika kulmikas, koska palloa on aika tuskaisa koodata kolmioista ja neliöistä. Mutta jos tekstuurina on vaikka sellainen pelkkä sininen taivas ilman pilviä, niin niitä kulmia ei varmaan erota. Mutta mitenhän sitten saisi toteutettua pilvet yms..?
Taivas on maa ylhäällä ja erivärisenä.
joo Grey toi on hyvä :o
Eikös pilvet kantsis tehä ihan läpinäkyvinä erillisinä lootina, jolloin niitä vois sitte liikuttaakin siellä taivaalla. :o
Ei kannata mitään palloja ruveta luomaan, niissä on paljon turhia faceja, kun kaiken voi luoda pelkällä kuutiolla (6 pintaa).
Kuution tekstuureissa pitää vain ottaa huomioon "perspektiivin" muutos reunojen lähellä, mutta tämänkin voi hoitaa automaattisesti, jos laskettaa kuvat "kolmidee ohjelmissa".
Kuutio-taivaassa saa tekstuurien laatu olla melko hyvä illuusion säilymiseksi, esimerkiksi kaupallisessa Valven Source-enginessä jota esimerkiksi tunnettu Half-Life 2 ja Counter-Strike: Source käyttävät, tulee taivas-kuution reunoihin selkeät linjat kun käytetään huonompia grafiikka-asetuksia. Täysillä grafiikka-asetuksilla illuusio on täydellinen: reunoja ei huomaa ollenkaan.
Pilvet voi toki tehdä läpinäkyvinä lootina, mutta sitten tulee ongelmaksi niiden toteutus. Jos laittaa laatikkoon läpinäkyvän pilvi-tekstuurin, se ei välttämättä näytä kauniilta. Parempi keino on luultavasti hieman alusta/rajapinta/laitteistoriippuvaisempi, mutta tulos on näyttävämpi, kun käytetään "oikeita" pilviä jotka lasketaan savuefektinä tjsp. Ainakin Crytek-moottorissa mainostetaan olevan volymetriset (mitähän tuo sanahirviö meinaa, joku saa selittää) pilvet. Luultavasti vaatii paljon tehoa. Yksi tapa on tietenkin käyttää monia läpinäkyviä spritejä joita laitellaan päällekkäin ja vierekkäin savuverho-efektin luomiseksi... Tämä oli nyt sitten mututietoa joten korjailkaa jos puhuin höpöä.
eiks ois mahdollista ottaa taivas-tekstuuri ja survasta taso "taivas" jonnekkin helvetin kauas ylös
Meitsi kirjoitti:
Kuutio-taivaassa saa tekstuurien laatu olla melko hyvä illuusion säilymiseksi, esimerkiksi kaupallisessa Valven Source-enginessä jota esimerkiksi tunnettu Half-Life 2 ja Counter-Strike: Source käyttävät
No onhan sitä käytetty jo paljon kauemminkin kuin Half-Lifeissä.
KingOfTheWorld kirjoitti:
eiks ois mahdollista ottaa taivas-tekstuuri ja survasta taso "taivas" jonnekkin helvetin kauas ylös
Tottakai olisi, mutta silloin taivaasta reilusti suurin osa olisi turhaan teksturoitu. Voi olla että grafiikkakorttien piirtoetäisyyskin rajoittaisi tason piirtoa, jolloin horisontin yläpuolelle jäisi hirmuinen rako.
edit:
Ja mietipä kuinka iso "tason" pitäisi olla, jotta se olisi minimissään juuri kuvaruudun levyinen kun se on siellä "helvetin kaukana".
Lebe80 kirjoitti:
KingOfTheWorld kirjoitti:
eiks ois mahdollista ottaa taivas-tekstuuri ja survasta taso "taivas" jonnekkin helvetin kauas ylös
Tottakai olisi, mutta silloin taivaasta reilusti suurin osa olisi turhaan teksturoitu. Voi olla että grafiikkakorttien piirtoetäisyyskin rajoittaisi tason piirtoa, jolloin horisontin yläpuolelle jäisi hirmuinen rako.
Heh, tuo on pieni ongelma jo kuutiotaivasta tehdessä, joutuu vähän kikkailemaan että toimii, joten tuolla KingOfTheWorldin tekniikalla ei taivas näkyisi kuin ehkä joillakin uusimmilla ja kalliimmilla näyttiksillä. Itselläni on Ati Radeon 9600XT, ja oletan tuota peliä tehdessäni että pelaajilla on vähintään suunilleen tuon tasoinen näyttis.
Kannattaa hommata joku 3D-peli, vanhakin vaikka ja sitä pelata että katsoa miten asiat ovat siinä. Sopivalla koodilla voi myös katsoa miltä näyttää kenttä ulkopuolelta. Myöskin pelien karttojen tutkiminen sopivalla editorilla antaa jotain viitteitä siitä miten taivas on toteutettu. Vanhemmatkin pelit ovat kelvollisia tälläiseen tutkimiseen.
Havaintona voisin mainita että sellaisen pelin kuin Bloodin karttaeditorissa saattoi asettaa taivaalle kolme erilaista säätöä. Yksi näytti sai taivaan näyttämään lieriöltä vähäsen, toinen lattanalta taustalta ja kolmas aika, noh, taivaalta. Tuli sitten myös pari seuraavaakin tekstuuria listalta taivaalle. Kaiketi siksi ettei sitä yhtä tarvinnut venyttää ja taivuttaa niin kamalasti. Eli taivas oli tavallaan vain tausta vanhoissa peleissä, jonka päälle sitten piirtyi seinät ja muut..
-Grey-
Tekstuurin kanssa kyllä joutuu olemaan tarkka, muuten käy näin: http://img76.imageshack.us/img76/1743/
Lebe80 kirjoitti:
No onhan sitä käytetty jo paljon kauemminkin kuin Half-Lifeissä.
Tottakai, mutta Source-viittaus johtui siitä, että vaikka se on "uudenaikainen" moottori, niin silti tekstuurien laadun tiputtaminen "pilaa" taivaan illuusion.
Tumpelo kirjoitti:
Tekstuurin kanssa kyllä joutuu olemaan tarkka, muuten käy näin: http://img76.imageshack.us/img76/1743/
kuvakaappausjs8.png ^-^
Tuon vuoksi ajattelin sitä palloa. Eli taivas on joka puolella hahmoa. Eikä moisen tarvitse olla objektin pinnassa. Riittää että on tekstuuri, jota käsitellään tietyllä tapaa, joka pidetään aina kameran edessä ja jonka päälle piirretään asioita. Eli ilman mitään objekteja olisi pelkkää taivasta loputtomiin. Pilvet ja muut voi jo toteuttaa objekteina taivaalle..
-Grey-
Voisihan taivaan toteuttaa myös niin, että se olisi kuution sijasta vaikka kolmikulmainen kartio. Tämä kylläkin asettaa lisää vaatimuksia tekstuurin laadulle...
Grey kirjoitti:
Tuon vuoksi ajattelin sitä palloa. Eli taivas on joka puolella hahmoa. Eikä moisen tarvitse olla objektin pinnassa.
Palloa on paljon hankalampi teksturoida kuin kuutiota. Kuutiotahan käytetään usein myös panoramakuvissa/-softissa.
Eli kuution teksturoinnin voi pilata ihan yhtä helposti kuin teksturoinnin pallonkin kanssa. Taivastahan ei kuulu varjostaa mitenkään vaan ainoastaan piirtää siihen tekstuurin värit.
Tuota noin, helpoiten tuo tosiaano onnistuisi kun saisi näytölle ensin piirrettyä taivaan, sitten siihen päälle kolmedee jutut jolloin vain ei mitään sisältävistä kohdista näkyisi taivas läpi. Mutta kuinka tuo onnistuisi, kokeilin piirtää SDL Blitsurface ja SDL Flip funktioilla siihen surfaceen mihin Open GL tekee kolmedeejutut, mutta tulee jotain segmentti erroria.
Ei valmiin kopioimisessa mitään ideaa ole :P
Ku se paras oppiminen tulee just siitä et ihan ite miettii ja kokeilee kaikkea kivaa ja sit lopulta toteaa miten se onnistuu kivasti, sit voi jos oikein viittii mennä ettimään parempia tapoja, joita lähes aina kuitenkin on.
Tzaeru kirjoitti:
ihan ite miettii ja kokeilee kaikkea kivaa ja sit lopulta toteaa miten se onnistuu kivasti
Ja sitten päätyy The Daily WTF:n :)
Sain nyt toteutettua ihan kohtalaisen näköisen taivaan, yhdistämällä n. 100 metrin päähän kamerasta sijoitettavat taivas-tekstuurit ja pienen sumutehosteen. Piirtoetäisyys ei nyt ole hurja mutta ei voi mitään.
http://img163.imageshack.us/img163/5448/
Kertokaa mielipiteenne tuotoksestani, voisitteko pelata peliä jossa taivas on toteutettu noin?
Tuosta kuvasta tulee mieleen ihan oikeasti vähän sateisen tuntuinen olo tjsp, en sitten tiedä johtuuko se taivaan väristä vai siitä sumuefektistä
joo, rajaas toi sumuefekti pois tosta horisontista nii tulee paremman näkönen. ihan sateinen nyt
ihq; mulle kelpais sumullaki
Vau! Voisi olla ilman sumua mutta tuolleenkin jo häikäisevä 2D-koodarille!
Itse asiassa tuollainen on yllättävän helppoa OpenGL:ää apuna käyttäen ;)
oikeasti, OpenGL on ihan xiittausta, tulee sellanen olo ku käyttelis jotakin pelinteko-ohjelmaa.
Eikö jonkun Doom 1 -tyylisen taivaan toteutuksen luulisi olevan kohtalaisen helppo tehdä?
KingOfTheWorld kirjoitti:
ihq; mulle kelpais sumullaki
Jep, lainaan itseltäni :D. Tosiaan minulle kelpaisi myös sumulla (jos pelaan jotain raskaampia pelejä, esim. Grand Prix 4, niin fps on n. 10 ruutua sekunnissa ja silti minulle kelpaa)
Tzaeru kirjoitti:
Itse asiassa tuollainen on yllättävän helppoa OpenGL:ää apuna käyttäen ;)
oikeasti, OpenGL on ihan xiittausta, tulee sellanen olo ku käyttelis jotakin pelinteko-ohjelmaa.
Heh, kyllähän se on yllättävän helppoa, kun ottaa huomioon että minä teen nyt 3D autopeliä OpenGL:llä ja viime talvena värkkäsin SDL:llä jotain 2D autopeliä enkä lopulta onnistunut. ^-^ Mutta miksipä sen vaikeaa pitäisi olla.
Tuosta sumusta, että sen väriä ja samalla taivaan sävyä muuttamalla tuosta saanee ei-sateisen näköisen. Sumu on jokatapauksessa pakollinen, sillä ilman sumua tuo on aivan hirveän näköinen.
Tee tuo niin, että taivas on pieni pallo, joka ensin renderöidään sisältä katottuna, sitten renderöidään ne objektit siihen päälle. Silloin se ei haittaisi enää piirtoetäisyyttä.
tein vähän samanlaisen (en sano millä, taidatte arvata) pallotaivaalla ja oli pakko ottaa tekstuuri pois. laitoin vaaleansinistä pallon taivaaks ja oli todella todella ruma jos ei ollut sumua... sumu auttoi
PC-Master kertoikin oikean ratkaisun: syvyyspuskuri pois päältä taivaan piirron ajaksi. Pilviin yksi tapa on vaikkapa se, että kehität aivan erillisen pilviobjektin, jonka voit sitten sijoittaa haluamaasi kohtaan (taas kerran aluksi vaikka pienoismallina ilman syvyyspuskurointia).
Monissa (ainakin vanhemmissa) peleissä on käytössä skybox eli nimensä mukaan juuri laatikon muotoinen järjestelmä. Jos hahmo ei voi lentää rajattoman korkealle, ulkonäköongelma ratkeaa (näiden pelien tapaan) sillä, että laatikon reunoilla on vuoria tai muuta vastaavaa siten, että itse taivas loppuu aikanaan, ja tällöin pilvet usein ovat osana tekstuuria, joka sitten rullaa pitkin ja poikin. (Olen tätä toteutustapaa analysoinut erityisesti Unrealin valikon avulla.) Jos vuoret eivät reunalle sovi, voi yrittää vaikkapa tehdä ensin riittävän kaukana näkyvät horisonttipalat, jotka piirretään kulisseina pystyasennossa, ja itse taivaan voi sitten reunimmaisista monikulmioistaan sulauttaa tähän (alpha-kanava on loistava työkalu).
metabolix, jos käyttää skyboxia ja lentää tarpeeks korkealle, niin kaikki objut häviävät epäaidosti samalla kertaa, olivat ne sitten juuri kameran alalaidassa tai sadan kilometrin päässä kamerasta. skyellipse korjaisi tämän...
Kuinkas tuo syvyyspuskuri otetaan pois päältä? Kokeilin näin: "glDisable(GL_DEPTH_TEST);", mutta en tainnut osua asian ytimeen, sillä tuo ei vaikuttanut.
Mites se sumu tehdään tiettyyn pisteeseen?
Tumpelo kirjoitti:
Kuinkas tuo syvyyspuskuri otetaan pois päältä? Kokeilin näin: "glDisable(GL_DEPTH_TEST);", mutta en tainnut osua asian ytimeen, sillä tuo ei vaikuttanut.
Riippuu missä vaiheessa haluat taivaasi piirtää. Mikäli teet sen ennen muiden kappaleidein piirtoa, pitäisi tuon olla tietääkseni oikea tapa.
Toinen tapa on piirtää taivas muiden kappaleiden jälkeen, jolloin asetat ensin vertailufunktiosi palauttamaan aina arvon epätosi, jolloin libGL katsoo taivaan olevan kaikkien kappaleiden takana. OpenGL:ssä tämä onnistuu näin:
glDepthFunc(GL_NEVER); // vertailu epäonnistumaan aina // skyboxin piirto tähän glDepthFunc(GL_LESS); // vertailu takaisin päälle
En ole ihan varma näiden suorituskykyeroista ja toivoisinkin, että joku tietävämpi kertoisi kumpi on nopeampi tapa: Ensin piirtämällä tulee väritettyä samoja pikseleitä kahteen kertaan näyttöpuskurille ja jälkeen piirtämällä libGL joutuu jokaisen taivaan pikselin kohdalla tarkastamaan väritetäänkö se vai ei.
KingOfTheWorld, jos osaisit lukea ajatuksella, huomaisit ehkä, että aivan erikseen mainitsin asiasta: "jos hahmo ei voi lentää rajattoman korkealle".
Piru vie, unohdin mokoman.
Sisuaski kirjoitti:
Ensin piirtämällä tulee väritettyä samoja pikseleitä kahteen kertaan näyttöpuskurille ja jälkeen piirtämällä libGL joutuu jokaisen taivaan pikselin kohdalla tarkastamaan väritetäänkö se vai ei.
Luulenpa että se ensin piirtäminen on nopeampaa, sillä pikselin tarkistus ja sitten piirto vie aikaslailla enemmän tehoja..
-Grey-
Kuinka iso sen pallon pitäisi olla? 200.0f?
kayttaja-4976 kirjoitti:
Kuinka iso sen pallon pitäisi olla? 200.0f?
Tuosta tulikin mieleen, että mitkä seikat vaikuttavat piirtoetäisyyteen? Omalla koneellani (käyttiksenä Linux Ubuntu, näyttiksenä Ati Radeon 9600XT) taivaan osia ei voi viedä 90.0f:ää kauemmaksi, sillä muutoin taivaan kulmat bugittavat. Tosin tuossa taivaan piirrossahan sillä ei ole merkitystä jos ottaa syvyysbufferin pois päältä, mutta tuo n. 90.0f piirtoetäisyys haittaa hiukan muidenkin objektien piirrossa. Näkeehän ihminen oikeastikin yli 90 metrin päähän ilman että rakennukset poksahtelevat näkyviin rumasti.
Tumpelo kirjoitti:
Näkeehän ihminen oikeastikin yli 90 metrin päähän ilman että rakennukset poksahtelevat näkyviin rumasti.
No shit Sherlock. Kaihan sitä joka pelissä piirrettäisiin koko universumi, jos se ei hidastaisi piirtonopeutta ja pelattavuutta.
Eräissä peleissä kaukana olevat esineet piirrettiin bittikartoiksi (taustalle) ja lähemmäksi tultaessa ne muutettiin 3d-malleiksi.
1.0f == 1.0 metri?
1.0f == 1. f tarkoittaa vain floattia, liukulukua.
Itse pidän tapana 1:stä pitää pelissä 23,134993 senttinä, ihan vain haasteen vuoksi. jep jep.
Piirtoetäisyyteen vaikuttaa esimerkiksi se, mitä glFrustum-funktiossa tai sen kavereissa on määritelty kauimmaksi arvoksi. Pikselien syvyysarvot normaalisti ovat välillä nollasta yhteen, laskukaava on (syvyys - minimi) / (maksimi - minimi). Ei se ole näytönohjaimesta kiinni vaan ohjelmastasi. Kannattaa joskus hieman tutustua OpenGL:n toimintaperiaatteisiin, jos aikoo sillä saada jotakin aikaan. Esimerkiksi NVidian sivuilta löytyy varsin informatiivisia dokumentteja.
Aihe on jo aika vanha, joten et voi enää vastata siihen.