Événements liés
  • Démo technique du samedi #5: 09 Juin 2007
Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: [Demo] Vision isométrique  (Lu 5210 fois)
0 Membres et 1 Invité sur ce fil de discussion.
birslip Hors ligne
Administrateur
*****
Messages: 363


Voir le profil WWW
« 09 Juin 2007, 20:49:18 »

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 !

http://www.slurm.biz/temp/cube1.pnghttp://www.slurm.biz/temp/Qbert.png

3D isométrique : introduction
Pour 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.

http://img72.imageshack.us/img72/4328/hom02cn6.jpg

Les mains dans le cambouis

On 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).

Code
(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.

http://www.slurm.biz/temp/isootile.png

Code
(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.

http://www.slurm.biz/temp/isooo.png

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.

http://www.slurm.biz/temp/3Dfinal.png

N'hésitez pas à poser des questions ! Azn
Journalisée
MasterDje Hors ligne
Diet Coke Addict
Global Moderator
*****
Messages: 2692


Voir le profil WWW
« Réponse #1 : 09 Juin 2007, 21:27:34 »

Belle démo, au fait Wink

Est-il imaginable, avec cette technique, de pouvoir faire des rotations  : vu que y a  de la 3d derriere, c'est possible de faire tourner la scène de 90 dègres ?
je crois me souvenir que "Avatar the last quelque chose" fonctionnait un peu de cette maniere : 3d iso mais rotation avec L & R ...

LBA, me voici !

« Dernière édition: 09 Juin 2007, 21:29:24 par MasterDje » Journalisée

http://palib.info/hosted/Cid/master.png
birslip Hors ligne
Administrateur
*****
Messages: 363


Voir le profil WWW
« Réponse #2 : 09 Juin 2007, 21:32:07 »

Oui biensûr, c'est de la 3D donc ça permet une rotation facile, ce que n'offre pas un moteur en 2D  Azn. Je pense qu'il suffit de mettre un petit gluLookAt, ou du genre. J'essayerai voir ce que ça donne  Smiley
Journalisée
Pitt Hors ligne
Administrateur
*****
Messages: 574


Voir le profil WWW
« Réponse #3 : 09 Juin 2007, 22:11:32 »

Vade retro Satanas Tongue
Non c'est tout simple : avant de te translater là où tu veux être, tu fais une rotation (autour de Z dans ton cas je crois). Et c'est tout ! Cool
Pas besoin de gluLookAt() pour si peu Azn
Journalisée
Alekmaul Hors ligne
Papi codeur et
Administrateur
*****
Messages: 890


Voir le profil WWW
Out of memory error ...

« Réponse #4 : 10 Juin 2007, 06:46:29 »

Très sympa , merci de cette démo technique Birslip.
Ce qui sera parfait, c'est d'avoir le même effet avec des étages et non un sprite, comme dans QBert, cité en haut de ton test.
Journalisée

Mon site PortableDev : l'émulation sur GBA et sur DS
Remi59 Hors ligne
Jr. Member
**
Messages: 56


Voir le profil
« Réponse #5 : 10 Juin 2007, 08:31:04 »

Démo vraiment exelente, que dire de plus... reste plus qu'à retravailler tout ça pour faire un vrai pti moteur, mais l'idée de base est là!
Journalisée

Phoenix DataBase v1.0 : www.phoenixdb.fr
Logiciel de gestion de collection video!

Mon site de dev. regroupant mes projets :
http://bennyrebirth.palib.info
omg Hors ligne
Full Member
***
Messages: 109


Voir le profil WWW
Codeur au Percil

« Réponse #6 : 10 Juin 2007, 16:26:16 »

Très sympa , merci de cette démo technique Birslip.
Ce qui sera parfait, c'est d'avoir le même effet avec des étages et non un sprite, comme dans QBert, cité en haut de ton test.
Peut être dan le cours "Vision Isométrique : Chapitre 2"?  Cheesy
Merci!
Journalisée

Alekmaul Hors ligne
Papi codeur et
Administrateur
*****
Messages: 890


Voir le profil WWW
Out of memory error ...

« Réponse #7 : 10 Juin 2007, 17:50:43 »

Ah, c'est toi qui t'y colle omg, sympa cela Azn
Nan, sans dec, je pense qu'il peut être simple de simuler les hauteur avec des objets 3D style cube empilés les uns sur les autres, vous en pensez quoi ?
Journalisée

Mon site PortableDev : l'émulation sur GBA et sur DS
birslip Hors ligne
Administrateur
*****
Messages: 363


Voir le profil WWW
« Réponse #8 : 10 Juin 2007, 17:59:43 »

Oui j'ai essayer hier soir de remplacer les simples carrés affiché pour le sol par des cubes, ça rend plutôt bien. C'est tout bête, il suffit juste de prendre un cube comme dans les exemples de libnds  Azn
Journalisée
Arialia Hors ligne
Hero Member
*****
Messages: 780


Voir le profil
« Réponse #9 : 10 Juin 2007, 18:03:11 »

miam miam que du bon merci birslip  Kiss
Journalisée

Mon blog de dev   - -  Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions Wink

Argh ma livebox fait des siennes ( bonne pour un échange), j'attends le technicien ....
omg Hors ligne
Full Member
***
Messages: 109


Voir le profil WWW
Codeur au Percil

« Réponse #10 : 10 Juin 2007, 18:07:35 »

Ah, c'est toi qui t'y colle omg, sympa cela Azn
Je n'ai jamais programmé sur DS pour l'istant! Mais j'avoue que ce cours me plait bien (en plus y'a la lib de Brunni  Roll Eyes )
Bref dès la fin de mois je pense m'y coller à cette chere DS!
Journalisée

Alekmaul Hors ligne
Papi codeur et
Administrateur
*****
Messages: 890


Voir le profil WWW
Out of memory error ...

« Réponse #11 : 11 Juin 2007, 08:22:40 »

Oui j'ai essayer hier soir de remplacer les simples carrés affiché pour le sol par des cubes, ça rend plutôt bien. C'est tout bête, il suffit juste de prendre un cube comme dans les exemples de libnds  Azn
Tu peux mettre à jour ton tuto pour nous montrer STP  Azn ?
Journalisée

Mon site PortableDev : l'émulation sur GBA et sur DS
Foxy Hors ligne
Jr. Member
**
Messages: 90


Voir le profil WWW
« Réponse #12 : 10 Décembre 2007, 15:05:23 »

Dans ton code:
Code:
		for(i=0;i<10;i+=2)	{
for(j=0;j<10;j+=2) {
SetTile(x+(i/2)*2816*2,y+(j/2)*2560);
SetTile(x+(i/2)*2816*2 + 2816,y+(j/2)*2560 + 2560/2);
}
}

A quoi correspondent les valeurs 2816 et 2560 ?
Journalisée
Mollusk Hors ligne
PAlib Guru et
Administrateur
*****
Messages: 3094


Voir le profil WWW
Ne vous posez pas de questions, codez !

« Réponse #13 : 10 Décembre 2007, 15:43:08 »

2560 => 256*10
2816 => 256*11

Donc au hasard je dirais une position 10, 11 en fixed point avec un décalage de 8 (mais j'ai pas regardé pour vérifier que c'est ça Azn)

edit : ouais, en fait pour éviter de dire des conneries je vais laisser birslip répondre Azn
« Dernière édition: 10 Décembre 2007, 15:45:28 par Mollusk » Journalisée

http://www.palib.info/images/mollusK.png
Foxy Hors ligne
Jr. Member
**
Messages: 90


Voir le profil WWW
« Réponse #14 : 10 Décembre 2007, 15:59:53 »

Je me suis dis la même chose, mais je n'arrive pas vraiment a comprendre d'où sortent ces valeurs Smiley
Journalisée
Pages: [1] 2   Haut de page
Imprimer

Aller à: