2012-12-02 3 views
2

D'accord, cela va être un peu compliqué à expliquer. Je fais un jeu de course "pseudo-3d" très basique pour Android en utilisant AndEngine (et à mon tour, openGL - je pense). Je ne crois pas qu'AndEngine ait vraiment quelque chose à voir avec ce problème, parce que j'accède directement aux fonctions OpenGL pour accomplir mon dessin. Quoi qu'il en soit, je copie-pasta'd un code qui a permis à la 2E AndEngine normalement d'avoir une perspective 3D (tutoriel pour tel peut être trouvé here.Cela fonctionne plutôt bien, et je ne crois pas que cela a beaucoup à . fais avec mon problème, mais je ne comprends pas bien openGL il est un peu difficile pour moi de dire Voici le code de la onLoadEngine (appelée lorsque l'application démarre) qui met en place la caméra avec une perspective 3D:openGL dessiner des sprites déformés (images) dans une perspective en 3d-3d

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT) { 
    //other methods... 
    private void setFrustum(GL10 pGL) { 
     // set field of view to 60 degrees 
     float fov_degrees = 60; 
     float fov_radians = fov_degrees/180 * (float)Math.PI;       

     // set aspect ratio and distance of the screen 
     float aspect = this.getWidth()/(this.getHeight()); 
     float camZ = this.getHeight()/2/(float)Math.tan(fov_radians/2);        

     // set projection 
     GLHelper.setProjectionIdentityMatrix(pGL); 
     GLU.gluPerspective(pGL, fov_degrees, aspect, camZ/10, camZ*10); 

     // set view 
     GLU.gluLookAt(pGL, 0,120f, camZ, 0, 0, 0f, 0, 1, 0); // move camera back+up 
     pGL.glScalef(1,-1,1); // reverse y-axis 
     pGL.glTranslatef(-CAMERA_WIDTH/2,-CAMERA_HEIGHT/2,0); // origin at top left 
    } 
}; 

Puis plus tard dans le onLoadScene (où le dessin a lieu), je dessine un tas de mes images comme suit:

for (int n=0;n<=100;n++) { 
    final int k = n; 

    final Sprite line = new Sprite(0, 0,CAMERA_WIDTH,16f, [AndEngine texture holding road img]) { 
    @Override 
     protected void applyTranslation(GL10 pGL) { 
      pGL.glTranslatef(this.mX, 120f, 15f*k); //16*k causes a sliver of a space between each segment 
      pGL.glRotatef(90f, 1, 0, 0); //**MAY BE MY ISSUE** 
     }   
    }; 
    scene.attachChild(line); //actually draws the image to the screen   
} 

Ce qui fonctionne très bien aussi, sauf pour une chose! Ça déforme la merde de mes images. Les images sont PNGs simples, à la fois correspondant à la CAMERA_WIDTH, et les deux qui se ressemblent à ceci: "road" segment - 320 x 16

Et quand je dessine sans la ligne rotate, je reçois ceci: without the rotating

qui a un milieu décemment droite line (tbh je serais heureux avec eux de cette façon), mais alors vous pouvez voir les bords de la route sont tous confrontés à l'opposé de la façon dont ils devraient être confrontés. Je me suis dit pourquoi ne pas simplement les retourner? Je pensais que je devrais les faire pivoter de 180 degrés autour de l'axe x, mais à la place cela les fait disparaître, et à la place j'ai trouvé que 90 degrés fonctionne (???). Quoi qu'il en soit, voici ce que je reçois:

final product

Alors oui. Voici où se situe mon problème - le diviseur de la voie du milieu est déformé comme de la merde !! Les lignes marquant le bord de la route s'alignent à merveille, mais pour une raison quelconque, c'est vraiment déconner avec cette ligne médiane. Je reçois la plupart des maths derrière le 3D, mais je ne sais vraiment pas quoi en faire ... c'est presque comme si l'image était compressée parce qu'elle était vue sous un angle aussi aigu, mais je ne sais pas vraiment comment diable je pourrais résoudre cela sans simplement faire une vue de haut en bas? : S

Quoi qu'il en soit ... des idées ou des conseils sont les bienvenus. Désolé c'est un post si long et alambiqué - cela rend difficile quand je n'ai vraiment aucune idée d'où vient le problème.

Aussi - Il est peut-être intéressant de noter que j'ai peu ou pas d'expérience avec les graphiques 3D ou OpenGL, et que j'ai encore moins envie d'en apprendre beaucoup sur eux en profondeur. J'ai besoin d'un pansement à ce problème!

Répondre

3

Ok donc j'ai trouvé la solution! Il s'avère qu'il ya ce petit problème appelé Perspective Corriger Texturing, qui est fondamentalement juste un drapeau qui doit être activé dans OpenGL pour ne pas fausser les images quand ils sont dessinés avec perspective.

intérieur mon code d'initialisation de l'appareil photo, j'ai ajouté cette ligne à la méthode setFrustum (GL10 pGL):

pGL.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

Que essentiellement résolu le problème.Les lignes sont aussi droites que jamais :) Je l'ai trouvé sur un autre post de stackoverflow où cette réponse n'était pas vraiment ce que le demandeur voulait, mais ça a marché pour moi: D Le fil qui m'a conduit à la réponse peut être trouvé here.

Questions connexes