Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Kamera ja nappula (C++ ja SDL)

Andu [15.06.2006 20:32:04]

#

1.
Voiko kameran tehdä peliin niin, että kaikkia mitä ruudulla on, ei tarvitse liikuttaa, vaan, että kameraa liikutetaan? Ja onko se järkevämpää niin päin?

2.
Miten voi tehdä niin, että kun mikään nappula ei ole pohjassa, tapahtuu jotain?

Heikki [15.06.2006 20:42:18]

#

1. En ole 3D-ohjelmointia liikaa harrastanut mutta käsittääkseni yleensä (ainakin OpenGL:ssä) on tapana liikuttaa kaikkia ruudulla olevia objekteja (onnistuu muutamalla OpenGL:n funktiolla). En usko että kameran liikuttaminen mitenkään järkevämpää on (onnistuuko se edes?)

2. Riippuu API:sta, mutta yleisesti lue kaikkien näppäimien tila taulukkoon (SDL:llä SDL_GetKeyState) ja katso onko mikään niistä pohjassa.

os [15.06.2006 20:49:20]

#

Näppäimistä voi SDL:ssä pitää kirjaa tarkkailemalla SDL_Eventtejä ja sillä tavoin päivittää listaa pohjassa olevista nappuloista.

SDL_Event event;
bool nappulat[NAPPULOIDEN_MAARA] = { 0 };

// ...

while(SDL_PollEvent(&event))
 if(event.type==SDL_KEYDOWN)
  nappulat[event.key.keysym.sym] = true;
 else if(event.type==SDL_KEYUP)
  nappulat[event.key.keysym.sym] = false;

EDIT:
3D-ohjelmoinnissa lasketaan jokatapauksessa kappaleiden paikka suhteessa kameraan. On aivan sama, kumpaa ajatellaan liikutettavan (tai käännettävän): kameraa vai kappaleita. Ohjelmoijan kannalta on varmaan helpompaa muuttaa kameran paikkaa ja laskea renderöintivaiheessa kameran ja kappaleiden erotusvektorit.

hunajavohveli [15.06.2006 20:51:10]

#

1. Riippuu ihan siitä, minkälainen (3D-)maailma on kyseessä. Esim. raytracereissa homma hoituu helposti kameran koordinaatteja muuttamalla. Monissa muissa taasen "kameran liikuttaminen" tarkoittaa käytännössä sitä, että objekteja liikutellaan suhteessa vastakkaiseen suuntaan, jolloin syntyy illuusio siitä, että kameraa olisi liikutettu.

Edit: Jos kaipaat täsmällisempiä neuvoja, kerro toki lisää, minkälainen peli on kyseessä.

Deewiant [15.06.2006 21:19:38]

#

Heikki kirjoitti:

1. En ole 3D-ohjelmointia liikaa harrastanut mutta käsittääkseni yleensä (ainakin OpenGL:ssä) on tapana liikuttaa kaikkia ruudulla olevia objekteja (onnistuu muutamalla OpenGL:n funktiolla). En usko että kameran liikuttaminen mitenkään järkevämpää on (onnistuuko se edes?)

OpenGL on yksi näistä, jotka toimivat kuten hunajavohveli jo ehti sanoa, eli kameraa ei liikuteta, vaan kaikkia esineitä liikutetaan vastakkaiseen suuntaan. Direct3D:stä en tiedä, mutta veikkaisin, että se tekee samalla tavalla, ainakin sisäisesti; esimerkiksi GLU, OpenGL Utility -kirjasto, sisältää funktioita jotka näennäisesti liikuttavat kameraa (kuten gluLookAt()), mutta nekin oikeasti vain liikuttavat maailmaa vastakkaiseen suuntaan.

Andu [16.06.2006 00:24:08]

#

Kiitos! Unohdin sanoa, että tarkoitin 2Dtä (ensin kirjoitin viestin jossa se sanottiin, mutta unohdin lähettää sen), mutta se ei luultavasti muuta asiaa.

os [16.06.2006 13:00:15]

#

2D:ssä teet enemmän itse, joten voit koodata myös "kameran" miten tahdot. Kamera voi olla vaikka jokin piste (pelaaja), jonka suhteen muiden objektien ja kenttäelementtien paikat piirtovaiheessa lasketaan.

Vastaus

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

Tietoa sivustosta