Après avoir fait mumuse avec mon framework turboconnard agd, j’ai quand même remarqué que ça ramait… le développement “Canvas mode” pour le jeu c’est vraiment trop lent.
Je suis donc passé en mode opengl pour dessiner mes jolis sprites. Le problème avec opengl c’est que c’est hyper complexe. Il faut environ douze jours pour comprendre comment tracer un triangle puis deux fois plus de temps pour y appliquer une texture. Je cherche à faire des choses simple… mais c’est déjà l’enfer pour trouver un tutoriel sur “comment appliquer une texture sur un carré” alors lorsqu’il s’agit de trouver “comment faire apparaitre une texture à 100% dans un univers en 3D” c’est la mort…
Le but recherché :
Dessiner des trucs en deux dimensions dans un univers en trois dimensions. Typiquement, ça permet de développer peinard en 2D sans se prendre la tête et de temps en temps claquer un effet 3D pour le “Wow effect”.
Une solution :
En opengl il y a un “mode” qui permet d’aplatir toutes les perspectives et d’ainsi travailler en deux dimensions (glOrthof pour android) et c’est pratique. Seulement si vous voulez une couche de 3D en plus ben vous êtes niqué.
On utilise alors le mode glFrustumf! (à tes souhaits)
glFrustumf c’est la méthode qui permet de définir la perspective de votre scène 3D. Bien comprendre cette méthode vous facilitera la vie pour vous représenter les éléments en 3D calqués sur votre écran 2d.
Cette méthode attend six paramètres : left, right, bottom,top, near, far. Les quatre premiers définissent le rapport de la fenêtre de vue de la scène. Cette fonction permet de définir le fenêtre de projection de l’univers 3D sur votre écran.
explications :
votre écran à un rapport largeur / hauteur (16/9, 4/3 etc…) avec un glFrustumf(-1,1,-1,1,near,far); vous aurez une projection de ce type :

Il faut donc “calculer” une projection correcte de type : glFrustumf(-(width/height),(width/height),-1,1,near,far);
Pour une unité de hauteur il ya (width/height) de largeur : Pour un 16/9 ça fait bien, 1 de hauteur pour 1.7778 de largeur.
Ok pour le rapport, fastoche. Après ça, ce que je voulais c’était d’avoir une texture à 100% lorsqu’elle est en z = 0.
Il faut d’abord comprendre que par défaut le “point de vue” de la scène est en 0,0,0 dans le repère. Si vous arrivez à afficher un quelconque objet, pour le voir vous devez soit reculer la “caméra”, soit éloigner l’objet. Mais de combien dois-je reculer la caméra pour que mon objet occupe bien sa “taille réelle” ?
La précédente fenêtre qu’on a déterminée se positionne en fait au paramètre “near” sur l’axe z :
exemple ici : glFrustumf(-(width/height),(width/height),-1,1,7,20);

Tout objet en dehors de la zone “couleur jambon” sur l’axe Z n’apparaitra pas. Maintenant, il faut réussir à placer l’objet bleu à la bonne position sur l’axe Z pour qu’il s’imprime à 100% sur l’écran. Un peu de trigonométrie suffit :
L’objet est un plan d’une unité (1×1), une texture de 64×64 est mappée dessus.
mon écran fait “height” en hauteur pour “1″ unité (rappelez vous le glFrustumf à 1 pour la hauteur).
le rapport de la texture est (64 / height ) pour une unité.
On calcule l’angle de l’origine vers l’objet :
ang = Math.atan2( ( 64 / height)) , near);
puis avec l’angle on calcul le z.
z = 1/Math.tan(ang);
Du coup si on recule la camera de -z, la texture fera pile poil 64×64 sur votre écran.