Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Neliulotteisuuden demonstrointi

Sivun loppuun

Anaatti [06.04.2012 18:52:40]

#

Tämän ohjelman on tarkoitus demonstroida neljää ulottuvuutta, ja ohjelmassa pääsee pyörittelemään tesseraktia sekä 3-palloa neljässä ulottuvuudessa. Ohjelmaan on toteutettu lisäksi vielä 3D renderöinti niin, että jos pystyy katsomaan kieroon siten, että kaksi vierrekkäistä kuvaa yhdistyy keskelle tarkasti, näkee tuloksen kolmiulotteisena.
Käytetty ohjelmointikieli on C++ ja renderöintiin käytetään SDL:ää ja OpenGL:ää. Paketin mukana tulee Windows binääri sekä Linux makefile. Lähdekoodeja saa käyttää vapaasti mihin lystää.

Kuva1
Kuva2
Kuva3

Lataa

Grez [06.04.2012 19:24:03]

#

Itsekin tein vastaavan joskus 10 vuotta sitten. Harmi ettei aivot pysty hahmottamaan neliuloitteisuutta samalla tavoin kuin 3-ulotteinen ymmärretään helposti 2-ulotteisesta projektiosta.

Miksi muuten noissa esimerkkikuvissa oikeanpuoleisessa on ohuemmat viivat tai huonompi antialiasointi?

Metabolix [06.04.2012 22:59:37]

#

Voisitko lisätä resoluution säädön ja mahdollisuuden vaihtaa kuvien paikkaa? Nyt kuvat ovat liian leveällä minun stereonäölleni, ja katson myös mieluummin kuvan taakse enkä kieroon.

Jossain vaiheessa voisit kehittää Makefile-tekniikkaasi niin, ettei kaikkea aina käännetä uudestaan. Paketin nimi saisi myös olla sama kuin siinä olevan hakemiston.

Anaatti [07.04.2012 00:10:11]

#

Grez kirjoitti:

Miksi muuten noissa esimerkkikuvissa oikeanpuoleisessa on ohuemmat viivat tai huonompi antialiasointi?

Itsekin oikeastaan huomasin tuon vasta nyt, koska olen pääasiassa tehnyt tätä läppärilläni, joka ei tue reunapehmennystä ollenkaan. En osaa tarkkaa vastausta antaa, mutta kuva on renderöity niin, että toinen kuvista tallennetaan tekstuuriin, joka sitten siirretään kuvan toiselle puolelle, ja toinen kuva piirretään suoraan ilman tekstuuriin tallentamista.

Metabolix kirjoitti:

Voisitko lisätä resoluution säädön ja mahdollisuuden vaihtaa kuvien paikkaa?

Ei nyt tullut tehtyä mitään hienoa resoluution säätömahdollisuutta, esimerkiksi tiedostosta lukemalla. Resoluutiota voi kuitenkin helposti muuttaa main.cpp:n alusta löytyvillä muuttujilla:

const short WIDTH = 512;
const short HEIGHT = 576;

Kuvien paikan vaihdon mahdollisuuden olisin toki voinut tehdä, mutta ei ikävä kyllä tullut mieleen. Tämän saa kyllä helposti aikaan muuttamalla camera.cpp:n rivin 28 muotoon

const float temp_x = x - (DRAW_3D ? ((float)d / 10.0 - 0.05) : 0);

reino [13.04.2012 21:19:08]

#

Itselläni ei oikeanpuoleinen kuva piirtynyt. Sen paikalla oli vain valkoista. Sanoi, että Didn't get multisampling. Voisit laittaa myös hiiriohjauksen sillä minun läppärissäni ei ole erillistä numeronäppäimistöä.

Anaatti [14.04.2012 01:41:34]

#

Tuo oikeanpuoleinen kuva tosiaan kopioidaan tekstuurin ennen kuin se lopulta piirretään ruudulle. Tuo Didn't get multisampling ei kuitenkaan ole virhe eikä vaikuta tässä tapauksessa. Vaikuttaa siis siltä, että näytönohjaimesi ei yksinkertaisesti tue kuvapuskurin kopioimista tekstuuriin, vaikka tekstuuri onkin "power of 2".

Olisinhan voinut toki tehdä tuon niinkin, että tekstuuriin kopioimista ei olisi tarvittu, mutta laiskuus tuli tässä tapauksessa vastaan, koska tuo kuitenkin toimi jopa vanhalla miniläppärilläni. :/

Metabolix [14.04.2012 11:24:14]

#

Anaatti kirjoitti:

Laiskuus tuli tässä tapauksessa vastaan – –

En ymmärrä, millä tavalla tekstuuriin kopioiminen on yhtään helpompaa kuin suoraan kahden kuvan piirtäminen eri glViewport-arvoilla tai hitaampi kuvan kopioiminen talteen glReadPixels-funktiolla.

Rasenger [14.04.2012 12:15:58]

#

Hienon näköistä silmät kieroon 3D:llä, vaikken ymmärräkään mitä neliulotteisuus tässä tarkoittaa.

User137 [14.04.2012 12:18:58]

#

Itseasiassa tekstuuriin piirtäminen on paljon tehokkaampaa kuin glReadPixelsin käyttö. Jos nyt "kopioinnilla" tarkoitat piirtämistä, jos ei niin luultavasti lähellä toisiaan. Kopioit koko väripuskurin tekstuuriin?

Anaatti [14.04.2012 13:07:14]

#

Funktio, jota tässä tapauksessa käytän on glCopyTexImage2D eli piirto ei tapahdu suoraan tekstuuriin, kuten esimerkiksi FBO:n tapauksessa, vaan ensiksi piirretään väripuskuriin, jonka jälkeen kuva tosiaankin kopioidaan tekstuuriin. Toki tämäkin on nopeampaa kuin glReadPixels, koska siihen ei tarvita koneen omaa muistia.

Kuvan koko on oletuksena 512 x 576, ja tekstuuri, johon kuva kopioidaan on pienin mahdollinen "power of 2"-tekstuuri eli tässä tapauksessa 512 x 1024.

ErroR++ [14.04.2012 14:48:29]

#

Aika hieno.


Sivun alkuun

Vastaus

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

Tietoa sivustosta