Java OpenGL, camera, mozgás az objektum körül

Java OpenGL, camera, mozgás az objektum körül
2011-10-22T10:32:36+02:00
2011-10-22T11:29:46+02:00
2022-11-23T10:40:39+01:00
adam21.
Üdv.

Programomba letett objektumok között szeretnék mozogni, a le, fel, bal, jobb billentyűkkel. Sokat kutakodtam neten, de nem találtam ere megfelelő példát, hogy lássam hogyan is néz ki egy ilyen. Hogyan kell ezt megoldani? Már van egy Camera metódus a programomba ami így néz ki:


private void setCamera(GL gl, GLU glu, float distance) { gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); float widthHeightRatio = (float) getWidth() / (float) getHeight(); glu.gluPerspective(55, widthHeightRatio, 1, 1000); glu.gluLookAt(0, 0, distance, 0, 0, 0, 0, 1, 0); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); }
Mutasd a teljes hozzászólást!
Az importjaid alapján AWT-t használsz az ablakkezeléshez. A Google-lel ezt a demót találtam neked billentyűesemények érzékelésére. Valószínű neked a fő ablakodra kell addKeyListener-rel rárakni egy billentyűzet-figyelőt, ami aztán már módosítgathatja a változóidat. Ha a lenyomott billentyű folyamatos mozgást kell, hogy okozzon, akkor plusz változókban meg kell jegyezni, hogy a fontos billentyűk le vannak-e nyomva éppen, és ha igen, akkor időközönként módosítani kell a koordináta-értékeket.
Mutasd a teljes hozzászólást!

  • Először is, a gluLookAt-et nem a projekciós mátrixra kell meghívni, hanem a model-view mátrixra.

    A gluLookAt első három paramétere azt adja meg, hogy honnan nézel, a második három azt, hogy hová nézel, a maradék három azt, hogy merre áll a kamerád teteje. Ez utóbbi maradhat konstans felfelé mutató vektor, hacsak nem valami világűrbeli lebegést akarsz ábrázolni.

    Innentől a nézőpont mozgatása annyi, hogy változtatod a szem helyzetét (első három paraméter). Ha nem egy pont körül akarsz körözni a nézőponttal, akkor a célkoordiniátákat (második három paraméter) is változtatnod kell. Ha ugyanannyival változnak mindig, mint a szem helyzete, akkor mindig egy irányba fog nézni a kamera.

    Én talán ezen a ponton már hagynám a gluLookAt-et, és helyettesíteném glTranslate és glRotate hívásokkal. Tárolod a kamera pozícióját (x,y,z) és azt, hogy melyik irányba néz (alfa). Rajzolás előtt glRotate-tel elforgatod a világot mínusz alfával, aztán glTranslate-tel eltolod a világot (-x,-y,-z) vektorral. De az is lehet, hogy pont ellenkező sorrendben kell csinálni, ez már kicsit elhomályosult A lényeg, hogy ezután a mozgató billentyűk az x,y és z értékeket módosítják, a balra/jobbra forgató billentyűk pedig az alfát.
    Mutasd a teljes hozzászólást!
  • Köszi a választ. A feladat konkrétan a világűrbe van. Van két bolygó és ezek körül szeretnék, mozogni az említett 4 irányba.(nem tudom ez mennyire befolyásolja azt amiket az előbb leírtál) Nagyjából értem, hogy amit leírtál a gluLookAt-ről csak arra lennék kíváncsi, hogy mindezt gombnyomásra hogyan érzékeli? Nincs erre valami konkrét példád? MEgköszönném.
    Mutasd a teljes hozzászólást!
  • Az OpenGL nem foglalkozik a billentyűzettel. Azt nem írtad le, hogy milyen környezetben dolgozol, így esélyem sincs megmondani, hogy a te környezetedben hogy kell a billentyűzetet kezelni. Ehhez tudni kéne, hogy milyen könyvtárakat (JAR-okat) használsz, hogyan inicializálod az ablakot, stb.
    Mutasd a teljes hozzászólást!
  • Netbeans IDE 7.0.1 -et használok és JOGL-ot.


    import com.sun.opengl.util.Animator; import com.sun.opengl.util.FPSAnimator; import com.sun.opengl.util.texture.Texture; import com.sun.opengl.util.texture.TextureData; import com.sun.opengl.util.texture.TextureIO; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.InputStream; import javax.media.opengl.DebugGL; import javax.media.opengl.GL; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCanvas; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.glu.GLU; import javax.media.opengl.glu.GLUquadric; import javax.swing.JFrame;

    Valamint találtam egy példakódot:

    http://potatoland.org/code/gl/source/glapp/GLCamera.java

    Csak ezzel az a baj hogy a Netbeans-be nem lehet felinstallálni a glmodel csomagot(GLSL Editor).
    Mutasd a teljes hozzászólást!
  • Az importjaid alapján AWT-t használsz az ablakkezeléshez. A Google-lel ezt a demót találtam neked billentyűesemények érzékelésére. Valószínű neked a fő ablakodra kell addKeyListener-rel rárakni egy billentyűzet-figyelőt, ami aztán már módosítgathatja a változóidat. Ha a lenyomott billentyű folyamatos mozgást kell, hogy okozzon, akkor plusz változókban meg kell jegyezni, hogy a fontos billentyűk le vannak-e nyomva éppen, és ha igen, akkor időközönként módosítani kell a koordináta-értékeket.
    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