Encore une démo pour la DS, en fait on sait faire que ça. Alors cette fois-ci nous allons nous intéresser aux jeux en 3D isométrique. Ce type de rendu est utilisé dans le jeu vidéo depuis très longtemps. En effet, dès 1982
Q*Bert utilise cette technique. Cette perspective permet de donner un peu de profondeur à un jeu tournant sur une console pouvant uniquement faire de la 2D. Mais ce rendu 3D est un véritable style, utilisé dans de très nombreux jeux, même récents !
3D isométrique : introductionPour faire moteur de 3D isométrique, on utilise généralement des backgrounds classiques avec map et tiles, comme on peut le voir dans plusieurs jeux (pour ne citer qu'eux) sur GBA : Breath of Fire, Lego Star Wars, etc. Ce genre de moteur est assez lourd à faire, il faut gérer la position des tiles, ainsi que leurs priorités.
La DS a le grand avantage d'avoir un GPU 3D, donc on va pas s'en priver ! À l'instar de Heroes of Mana qui devrait bientôt sortir sur DS, nous allons tenter de faire un rendu isométrique.
Les mains dans le cambouisOn va s'attaquer au code, à proprement parler, sur DS. Pour cette démo il va falloir s'équiper de la
µlib de notre ami Brunni, ainsi que d'une libnds fonctionnelle et récente (au jour du 9 juin 2007).
Premièrement, il va falloir mettre le mode 3D en projection orthogonale (comme dans l'exemple de devkitPro).
(c):
glOrthof32(floattof32(-3), floattof32(3), floattof32(-2), floattof32(2), floattof32(0.1), floattof32(100));
Ensuite on va partir d'une image de 32x32 pixels, que l'on va projeter de manière isométrique. Il s'avère que dans les jeux, pour un rendu isométrique joli, l'angle sur l'axe X est de 26.565 ° (
arctan(0.5)) et de -45 ° sur l'axe Y. La DS malheureusement n'est pas assez précise pour ça, nous allons donc arrondir à 27.

(c):
void SetTile(int x, int y) {
glLoadIdentity();
MATRIX_TRANSLATE = x;
MATRIX_TRANSLATE = y;
MATRIX_TRANSLATE = floattof32(-5);
glRotatef32i(27 * LUT_SIZE / 360, floattof32(1.0), floattof32(0.0), floattof32(0.0));
glRotatef32i(-45 * LUT_SIZE / 360,floattof32(0.0), floattof32(1.0), floattof32(0.0));
MATRIX_SCALE = floattof32(1.0);
MATRIX_SCALE = floattof32(1.0);
MATRIX_SCALE = floattof32(-1.0);
ulSetTexture(imgFloor);
glBegin(GL_QUADS);
glTexCoord2f32(floattof32(4.0f), floattof32(4.0f));
glVertex3v16(floattov16(-1.0f), floattov16(-1.0f),floattov16( -1.0f));
glTexCoord2f32(floattof32(0.0f), floattof32(4.0f));
glVertex3v16( floattov16(0.0f), floattov16(-1.0f), floattov16(-1.0f));
glTexCoord2f32(floattof32(0.0f), floattof32(0.0f));
glVertex3v16( floattov16(0.0f), floattov16(-1.0f), floattov16(0.0f));
glTexCoord2f32(floattof32(4.0f), floattof32(0.0f));
glVertex3v16(floattov16(-1.0f), floattov16(-1.0f), floattov16(0.0f));
glEnd();
}
Il suffit donc de faire appel à cette fonction pour afficher une image de manière isométrique.
Voilà, cette démo est juste une astuce pour afficher de la 3D isométrique en utilisant les capacités du GPU 3D de la DS.
Vous pouvez télécharger le code source de la démo complète, avec un sprite qui se bouge dessus. Cool. N'hésitez pas à poser des questions !
