Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Matikkaongelma

crafn [05.01.2006 17:47:44]

#

Siis...
Mä oon tekemässä peliä, mutta on tullut ongelma!
Tämän koodinpätkän pitäisi piirtää neliö ja tarkistaa onko pelaaja (pelaajan kordinaatit ovat kohtax, kohtay ja kohtaz) piirretyn neliön kohdalla. Mutta jos neliötä "kääntää" niin sen ympärille tulee "näkymätön kuutio" jonka läpi ei pääse. Eli nämä for-silmukat tarkistaa vaan kuution muotoisen alueen.
...Selitin varmaan aika epäselvästi, mutta koodi varmaan selventää hiukan:

int tarkistus = 0;

float x1 = 0.0, x2 = 0.0, x3 = -0.1, x4 = -0.1;
float y1 = -0.1, y2 = 0.1, y3 = 0.1, y4 = -0.1;
float z1 = 0.5, z2 = 0.5, z3 = 0.6, z4 = 0.6;

glBegin (GL_POLYGON);

glVertex3f (x1, y1, z1); // vasen alakulma
glVertex3f (x2, y2, z2); // vasen yläkulma
glVertex3f (x3, y3, z3); // oikea yläkulma
glVertex3f (x4, y4, z4); // oikea alakulma

glEnd ();

for(float x=x4; x<x1; x+=0.01){
for(float y=y1; y<y2; y+=0.01){
for(float z=z1; z<z3; z+= 0.01){

        if(kohtax+0.01 > x && kohtax-0.01 < x && kohtay+0.01 > y && kohtay-0.01 < y && kohtaz-0.01 < z && kohtaz+0.01 > z) tarkistus = 1;
}
}
}

Miten siis saisi nämä for-silmukat tarkistamaan vain sen piirretyn neliön muotoisen alueen?

TeeVee [05.01.2006 18:01:44]

#

Kysymykseesi vastausta en osaa sanoa, mutta suosittelen sisentämään hieman paremmin, jotta koodista tulisi selvempää

for(float x=x4; x<x1; x+=0.01)
{
      for(float y=y1; y<y2; y+=0.01)
      {
          for(float z=z1; z<z3; z+= 0.01)
          {
              if(kohtax+0.01 > x && kohtax-0.01 < x && kohtay+0.01 > y && kohtay-0.01 < y && kohtaz-0.01 < z && kohtaz+0.01 > z) tarkistus = 1;
          }
      }
}

Itse vain kiinnitän huomiota sisentämiseen, koska itselläni on tullut ongelmia, jos sulkuja on ollut liian vähän/liikaa.

Metabolix [05.01.2006 19:06:07]

#

Menepä aluksi katsomaan Heikin vinkkiä https://www.ohjelmointiputka.net/koodivinkit/24844-cpp-törmäystarkistus-3d-avaruudessa-jana-ja-kolmio ja kokeile Googlella.

Muutenkin pitäisin suotavana, että itse yrittäisit kehittää tarvittavat kaavat. Minä kokeilin useaan kertaan ja väänsin ties kuinka monta tuntia, ja olen hyvin tyytyväinen, että tein sen itse. Kynää ja paperia suosittelen, sekä ymmärrystä vektorien piste- ja ristituloista.

Mutta jos osaat itse niitä pisteitä kääntää, niin etköhän sitten osaa tuonkin kaavan kehittää. Vai tuliko otettua valmis kaava? :)

Pisteen etäisyys tasosta saadaan kaavasta ax + by + cz + d, missä abcd on tason yhtälö eli abc on tason normaali ja d sopiva vakio, jonka saa helposti laskettua siirtämällä d:n toiselle puolelle yhtälöä ja sijoittamalla xyz:ksi jonkin tason pisteen.

Oma leikkausfunktioni tarkistaa, leikkaako annettu jana annetun kolmion. Lasken, missä pisteessä jana leikkaa tason (jos leikkaa) ja onko tämä piste kolmion sisäpuolella. Ensimmäinen meni paperilla ja kynällä varsin nopeasti, kun keksi idean, ja jälkimmäisessä tarvitsee vain laskea sopiva tason yhtälö, jonka taso kulkee kolmion sivun kautta eri suunnassa, ja katsoa, onko leikkauspiste samalla puolella jokaista näistä tasoista.

Valmista koodia tuollaiseen en viitsisi liikaa antaa, jos et itse ymmärrä, mistä ratkaisut tulevat. Sitä paitsi elämässä pitää olla haasteita :P

Niin ja älä nyt hyvä ihminen GL_POLYGONilla piirrä! Kolmio on ainut oikea kuvio; mikä tahansa muu voi joutua pois tasosta, mutta kolmio on aina vain yksi taso.

Vastaus

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

Tietoa sivustosta