Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Kuinka toteuttaa taivas 3D-pelissä?

Sivun loppuun

Tumpelo [17.08.2006 21:21:08]

#

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

Tzaeru [17.08.2006 22:06:54]

#

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

Grey [18.08.2006 08:07:21]

#

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-

Tumpelo [18.08.2006 09:47:56]

#

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

tgunner [18.08.2006 11:02:37]

#

Taivas on maa ylhäällä ja erivärisenä.

Tzaeru [18.08.2006 13:39:17]

#

joo Grey toi on hyvä :o

Spongi [18.08.2006 13:57:02]

#

Eikös pilvet kantsis tehä ihan läpinäkyvinä erillisinä lootina, jolloin niitä vois sitte liikuttaakin siellä taivaalla. :o

Lebe80 [18.08.2006 14:20:31]

#

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

Meitsi [18.08.2006 15:22:12]

#

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öä.

moptim [18.08.2006 16:19:46]

#

eiks ois mahdollista ottaa taivas-tekstuuri ja survasta taso "taivas" jonnekkin helvetin kauas ylös

Lebe80 [18.08.2006 16:52:07]

#

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

Tumpelo [18.08.2006 17:00:16]

#

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.

Grey [18.08.2006 17:26:22]

#

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-

Tumpelo [18.08.2006 17:31:33]

#

Tekstuurin kanssa kyllä joutuu olemaan tarkka, muuten käy näin: http://img76.imageshack.us/img76/1743/kuvakaappausjs8.png ^-^

Meitsi [18.08.2006 17:47:56]

#

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.

Grey [18.08.2006 17:49:34]

#

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-

Meitsi [18.08.2006 17:52:20]

#

Voisihan taivaan toteuttaa myös niin, että se olisi kuution sijasta vaikka kolmikulmainen kartio. Tämä kylläkin asettaa lisää vaatimuksia tekstuurin laadulle...

Lebe80 [18.08.2006 18:30:15]

#

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.

Tumpelo [18.08.2006 20:19:08]

#

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.

WinC [18.08.2006 23:24:04]

#

http://gpwiki.org/index.php/Sky_Box

Tzaeru [19.08.2006 01:26:45]

#

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.

Blaze [19.08.2006 14:59:54]

#

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 :)

Tumpelo [19.08.2006 19:17:00]

#

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/kuvakaappausdq0.png

Kertokaa mielipiteenne tuotoksestani, voisitteko pelata peliä jossa taivas on toteutettu noin?

miiro [19.08.2006 19:42:46]

#

Tuosta kuvasta tulee mieleen ihan oikeasti vähän sateisen tuntuinen olo tjsp, en sitten tiedä johtuuko se taivaan väristä vai siitä sumuefektistä

Tzaeru [19.08.2006 19:51:48]

#

joo, rajaas toi sumuefekti pois tosta horisontista nii tulee paremman näkönen. ihan sateinen nyt

moptim [19.08.2006 20:46:44]

#

ihq; mulle kelpais sumullaki

kayttaja-4976 [19.08.2006 21:04:37]

#

Vau! Voisi olla ilman sumua mutta tuolleenkin jo häikäisevä 2D-koodarille!

Tzaeru [19.08.2006 21:24:56]

#

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.

Kipperi [19.08.2006 21:33:43]

#

Eikö jonkun Doom 1 -tyylisen taivaan toteutuksen luulisi olevan kohtalaisen helppo tehdä?

moptim [20.08.2006 07:35:02]

#

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)

Tumpelo [20.08.2006 08:24:20]

#

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.

InvalidCo [20.08.2006 12:30:06]

#

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

moptim [26.08.2006 14:50:36]

#

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

Metabolix [26.08.2006 16:52:10]

#

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

moptim [26.08.2006 20:07:27]

#

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

Tumpelo [26.08.2006 21:33:49]

#

Kuinkas tuo syvyyspuskuri otetaan pois päältä? Kokeilin näin: "glDisable(GL_DEPTH_TEST);", mutta en tainnut osua asian ytimeen, sillä tuo ei vaikuttanut.

kayttaja-4976 [26.08.2006 22:14:02]

#

Mites se sumu tehdään tiettyyn pisteeseen?

Sisuaski [27.08.2006 09:16:59]

#

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.

Metabolix [27.08.2006 18:53:12]

#

KingOfTheWorld, jos osaisit lukea ajatuksella, huomaisit ehkä, että aivan erikseen mainitsin asiasta: "jos hahmo ei voi lentää rajattoman korkealle".

moptim [27.08.2006 18:55:18]

#

Piru vie, unohdin mokoman.

Grey [27.08.2006 20:09:57]

#

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-

kayttaja-4976 [28.08.2006 10:39:30]

#

Kuinka iso sen pallon pitäisi olla? 200.0f?

Tumpelo [28.08.2006 11:09:43]

#

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.

Lebe80 [28.08.2006 13:27:23]

#

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.

kayttaja-4976 [31.08.2006 14:44:06]

#

1.0f == 1.0 metri?

Tzaeru [31.08.2006 15:48:29]

#

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.

Metabolix [02.09.2006 13:41:54]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta