C++ Openl Célkereszt

C++ Openl Célkereszt
2010-08-06T18:37:35+02:00
2010-08-07T15:39:25+02:00
2022-11-18T18:15:34+01:00
gtsxxx
Hello!

Most készül életem első 3d-s játéka, és egy kicsit elakadtam. Az a problémám, hogy nm tudom berakni a célkeresztet. Úgy gondoltam, hogy a célkeresztet 2d-ben rajzolom meg(egy egyszerű kereszt) és az a képernyő közepén marad mindíg. ha kiszedem ezt a sort


gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f);

akkor a keresztet ugyan kirajzolja de akkor a többi dolgot nem.

Tudna valaki segíteni?
Mutasd a teljes hozzászólást!
általában ez a "2páros" állítja be, hogy merre is nézel:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,1000.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,-10, 0,0,0, 0,1,0);//ezt nézd meg, hogy melyik mi röviden ennyi: "innen", "ide", up vector.

de a lényeg, hogy ha a projekciós mátrixot reseteled(glLoadIdentity)
akkor még a modelview nem resetelödik, oda is ki kell adni a glLoadIdentity-t.

tehát:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

úgymond ez a páros állítja be "alapra" a nézeti mátrixot.
de egységmátrix esetén, akkor sem kell 100 jobb/balra. jó ez nem hiba.

ui.: esetedben szerintem még a modelview is kéne resetelned, mert ha nem teszed, akkor a gltranslate, glscalef, stb... eltolodva,méreteződve... rajzolodik ki a kereszted.
Mutasd a teljes hozzászólást!

  • szia

    a gluperspective perspektív transzformáció leképezésére állítja a projekciós mátrixot, de a célkereszt kirajzolásához nem az kell.

    megoldás:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f);

    kirajzolod a 3D-s dolgokat..

    végül:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    kirajzolod a célkeresztet..
    Mutasd a teljes hozzászólást!
  • ez vagy jó vagy nem

    ki tudja mi volt ezelőtt:
    "gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f);"

    és a modelview matrix-al dolgozik-e??? ha igen, nem ártana visszaállni rá, beállítani stb...
    Mutasd a teljes hozzászólást!
  • Mindent ugy csináltam ahogy atx mondta, legalábbis szerintem és nem jó. Mit nem csinálok jól?


    glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,1000.0f); glEnable(GL_DEPTH_TEST); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_TEXTURE_2D); //3d-s dolgok kirazjolása glMatrixMode(GL_PROJECTION); glLoadIdentity(); glPushMatrix(); glBegin(GL_LINES); glVertex2d(100,0); glVertex2d(-100,0); glVertex2d(0,100); glVertex2d(0,-100); glEnd(); glPopMatrix(); glFlush(); glutSwapBuffers();
    Mutasd a teljes hozzászólást!
  • épp arról beszéltem.

    a modelview mátrixot is illene, esetleg beállítani a 3d-s dolgokhoz.

    gondolom "csak" a kereszt látszik? vagyis ez se.
    "
    glVertex2d(100,0);
    glVertex2d(-100,0);
    "
    egységmátrix épp arról, szól hogy a főátlóban 1esek vannak.

    ez minek, ha nem is használod:
    "
    glPushMatrix();
    "
    Mutasd a teljes hozzászólást!
  • Minden látszik, csak a kereszt nem.
    amikor a kamerát állítom be akkor van egy ijen sorom

    glMatrixMode(GL_MODELVIEW); // Modeling transformation glLoadIdentity();

    hogy kéne beállítani?
    Mutasd a teljes hozzászólást!
  • általában ez a "2páros" állítja be, hogy merre is nézel:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,1000.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,-10, 0,0,0, 0,1,0);//ezt nézd meg, hogy melyik mi röviden ennyi: "innen", "ide", up vector.

    de a lényeg, hogy ha a projekciós mátrixot reseteled(glLoadIdentity)
    akkor még a modelview nem resetelödik, oda is ki kell adni a glLoadIdentity-t.

    tehát:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    úgymond ez a páros állítja be "alapra" a nézeti mátrixot.
    de egységmátrix esetén, akkor sem kell 100 jobb/balra. jó ez nem hiba.

    ui.: esetedben szerintem még a modelview is kéne resetelned, mert ha nem teszed, akkor a gltranslate, glscalef, stb... eltolodva,méreteződve... rajzolodik ki a kereszted.
    Mutasd a teljes hozzászólást!
  • A változatossság kedvéért én is 3D-t nyüstölök

    A célkeresztet nem is perspektív nézetben kéne kirajzolni.
    Több okból:
    - A célkereszt mérete függ attől, milyen "messzire" rajzolod
    - A látószög esetleg állítható a játék menüjében, az kihat a célkereszt méretére.
    - Pl. távcsöves puskánál "zoomolhatsz", akkor is változik a látószög, hatás ugyanaz.

    A probléma azzal kerülhető meg, hogy újra beállítod a frustumot a célkereszt rajzolása előtt, és akkor nincs gond.

    Mivel úgy is kell majd Hud-od csinálnod, azt meg 2D-ben praktikus, rajzold ki a célkeresztet a 2D-s menetben.


    // Player.Alpha: maga körüli elfordulás (egér jobb-bal mozgás) // Player.Beta: föl-le nézés -89 +89 fok tartományban engedve // Player.Position: játékos helye a pályán (3D-s vektor (x,y,z)) // Look, Eye, Center változók 3D-s vektorok Look.X = cos(Player.alpha * pi / 180) * cos(Player.beta * pi / 180); Look.Y = sin(Player.alpha * pi / 180) * cos(Player.beta * pi / 180); Look.Z = sin(Player.beta * pi / 180); // játékos szeme 30 egység magasan van pozíciójához képest Eye = VectorAdd(Player.Position,Vector(0,0,30)); // nézési irányt a szempozícióhoz adjuk, ez a kamerabeállításnak kell Center = VectorAdd(Eye, Look); // vetítési mátrixra állunk glMatrixMode(GL_PROJECTION); // egységmátrix betöltése glLoadIdentity(); // látószög beállítás gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,10.0f,10000.0f); // kamera beállítás (szem koordináta, amerre néz, és felefele irány) gluLookAt(Eye.X,Eye.Y,Eye.Z, Center.X, Center.Y, Center.Z, 0, 0, 1); // modell mátrixra állunk glMatrixMode(GL_MODELVIEW); // egységmátrix betöltése glLoadIdentity(); // itt kirajzolod a pályát ... ... ... // vetítési mátrixra állunk glMatrixMode(GL_PROJECTION); // egységmátrix betöltése glLoadIdentity(); // párhuzamos vetítést állítasz be // vetítési sík mérete megegyezik a képernyő méretével // nekem a progi egyéb részei miatt így jobb, de lehetne // gluOrtho2D(-screen_width/2,screen_width/2,-screen_height/2,screen_height/2); // beállításokat is használni, és akkor a [0,0] koordináta a képernyő közepén lenne // ez a célkereszt rajzolásánál lenne praktikusabb gluOrtho2D(0,screen_width,0,screen_height); // modell mátrixra állunk glMatrixMode(GL_MODELVIEW); // egységmátrix betöltése glLoadIdentity(); // célkereszt rajzolása // négy pici vonalka, mintha egy kereszt közepét kivágták volna // képernyő közepének számítása (a fentebb írtak miatt) x=screen_width*0.5f; y=screen_height*0.5f; // célkereszt "vonalkáinak" belső és külső mérete a=screen_height*0.008f; b=screen_height*0.02f; glBegin(GL_LINES); glVertex2f(x-b,y); glVertex2f(x-a,y); glVertex2f(x+a,y); glVertex2f(x+b,y); glVertex2f(x,y-b); glVertex2f(x,y-a); glVertex2f(x,y+a); glVertex2f(x,y+b); glEnd(); // kirajzolod a feliratokat, fegyver ikonokat, radart, kiskutya fülit


    Az alábbi képen látszik az eredmény Célkereszt

    Remélem nem írtam el semmit, az én progim pascal, próbáltam c-síteni

    Hosszú távon ne vonalkákat rajzolj (majd én sem, de egyelőre jó ez) hanem egy téglalapot célkereszt textúrával (átlátszóságkezeléssel)
    Mutasd a teljes hozzászólást!
  • Hello!

    Boccs hogy ilyen rég nem reagáltam a válszokra, de csak most volt időm kipróbálni őket. A megoldás az volt, hogy a Projekciós mátrikszot és a modelview-et is resetelni kellett. de az összes hozzászólás nagyion hasznos volt ezért mindenkinek köszönöm.
    Itt egy kép a játékról(A célkereszt csak azért nem látszik mert fekete az is de egyépként ott van, majd átszinezem):
    játék
    Mutasd a teljes hozzászólást!
  • glortho, inkabb. Vagy allits be ortho vetitest tartalmazo matrixot sajat magad a projection matrixban.
    Nem merem javasolni a kamera matrix invertalasat, hogy megkapd, egy keppontbol inditott sugar mit metsz a 3d vilagban... de az is egy megoldas.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd