1

Je n'arrive pas à créer la fonction Z_Buffer() du tutorial de Christophe Heulin qui se trouve tout en bas de cette page: http://membres.lycos.fr/heulin/3D/chap5.html (en fait la seulle fonction qu'il ne donne pas)
Comme je sais que vous êtes plusieurs à l'avoir converti et ou même optimisé, je voudrais bien un ptit coup de main...
J'ai un début: (j'ai laissé en commentaire le pseudo code C du tutorial)

void Z_Buffer()
{
int x,y;

for(y=0;y<160;y++) // for(y=0;y<YMAX;y++)
for(x=0;x<240;x++) // for(x=0;x<XMAX;x++)
PutPixel(x,y,0x00); // usuellement on met 0 ,consiste juste à vider l'écran

for(i=0;i<Nb_faces;i++) // for(chaque polygone)
for(j=0;j<Point2D[i];j++) // for(chaque point du polygone projete)
double z = Facette[i].z // profondeur du pixel de coord (x,y) à l'ecran
if(z>LireZ(x,y)) // retourne la valeur du buffer Z en (x,y)
{
Ecrire Z(x,y,z);
PutPixel(x,y,couleur);
}
}

Déja je comprend pas tout: la première partie sert à effacer l'écran au lieu d'initialiser le tableau z-buffer à zero ?
La difficulté consiste à trouver z, ...d'après le tutorial z = (-D -Ax -By)/C , que representent ces valeurs?
Puis la dernière partie:
if(z>LireZ(x,y)){ // donc il y faudra déclarer et initialiser le tableau z?
Ecrire Z(x,y,z);
PutPixel(x,y,couleur);} // alors là je suppose que z_buffer() est appelé à la place de PutPixel dans la fonction fill_triangle ? (je me demandais si elle etait appelée à la place de ClearBuffer...ou ailleur...)

2

La difficulté consiste à trouver z, ...d'après le tutorial z = (-D -Ax -By)/C , que representent ces valeurs?


bon, deja... utilise pas cette formule, t'aura une division par test dans le Z-Buffer, ca va pas etre super pt de vue vitesse... interpole plutot les Z entre les differents sommets de ton polygone, t'aura plus qu'une division par scanline (si tu remplis tes polygones comme ca bien sur...) t'aura un truc du genre:

draw_scanline(x0, x1, z0, z1, ...)
{
  int z_inc;
  int dx,dz;
  [...]

  dx = x1 - x0;
  dz = z1 - z0;

  z_inc = dz/dx;

  do
  {
    z0 += dz;
  // et la, dans z0 t'as la coordonnee Z du pixel....
    [...]
  } while(dx--)
}

GUNNM a écrit :
Je n'arrive pas à créer la fonction Z_Buffer() du tutorial de Christophe Heulin qui se trouve tout en bas de cette page: http://membres.lycos.fr/heulin/3D/chap5.html (en fait la seulle fonction qu'il ne donne pas)
Comme je sais que vous êtes plusieurs à l'avoir converti et ou même optimisé, je voudrais bien un ptit coup de main...
J'ai un début: (j'ai laissé en commentaire le pseudo code C du tutorial)
Déja je comprend pas tout: la première partie sert à effacer l'écran au lieu d'initialiser le tableau z-buffer à zero ?


heu, bah la, soit il c plante, soit je comprend rien a son algo de Z-Buffer... dans la premiere partie, normalement tu dois effacer le Z-Buffer.
Puis la dernière partie:
if(z>LireZ(x,y)){ // donc il y faudra déclarer et initialiser le tableau z?
Ecrire Z(x,y,z); PutPixel(x,y,couleur);} // alors là je suppose que z_buffer() est appelé à la place de PutPixel dans la fonction fill_triangle ? (je me demandais si elle etait appelée à la place de ClearBuffer...ou ailleur...)


perso je trouve que son exemple est mal foutu... c'est mieux une fct clear_buffer() qui te remet a 0 tout ton Z-Buffer, et le test, tu le fais directement dans ta fonction de remplissage de triangles, pas besoin d'une fct separee pour ca... smile

In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

3

ah tiens? c pour la GBA? j'av pas vu le nom du forum en postant smile cool! smile c koi que tu nous fait? juste un moteur ou bien un jeu? smile
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

4

merci pour tes reponses...
sBibi
a écrit : interpole plutot les Z entre les differents sommets de ton polygone, t'aura plus qu'une division par scanline (si tu remplis tes polygones comme ca bien sur...) t'aura un truc du genre:
dans la fonction qui trace les ligne, avec juste deux points ?
draw_scanline(x0, x1, z0, z1, ...)
{
  int z_inc;
  int dx,dz;
  [...]

  dx = x1 - x0;
  dz = z1 - z0;

  z_inc = dz/dx;

  do
  {
    z0 += dz;
  // et la, dans z0 t'as la coordonnee Z du pixel....**
    [...]
  } while(dx--)
}

**Pourquoi on calcule z_inc alors? je suppose que c'est une erreur, donc z_inc represente la profondeur en x,y ? ou la profondeur moyenne du polygonne?

Je connais pas scanline, c'est une fonction de tracé de ligne apparemment, ou de remplissage de triangles? (à cause de cette histoire de 2 ou 3 points)

5

Un moteur je saurais pas faire comme tu vois, mais un jeu pourquoi pas...
Rogue Squadron? J'avais vus sur le site de Moitib http://moitib.free.fr/Version%20Francaise/indexFr.htm le jeu 'Space Dementia' qui m'avais donné cette idée...mais j'en suis pas là, je verrais si je m'en sort en ameliorant un peu le moteur de Heulin.triso

6

arf, nan, c'est une fonction utilisee par le remplisseur de triangles... de toute facon, utiliser un Z-Buffer avec des lignes, en fil de fer, ca te servira a quasiment rien...

pour remplir un triangle, tu le decompose en scanlines horizontales (le triangle est decompose en lignes horizontales koi...)

et l'exemple ke g mis, ct pour tracer cette scanline. t'as la hauteur y de la scanline, la coordonnee x de son point de depart (x0), et la coord x de sont point d'arrivee (x1).

z_inc est l'increment a ajouter aux Z pour chaque pixel de la scanline... si t'as:


v0 ------------------------- v1

avec la coord x de v0 == x0 et la coord z de v0 == z0, pareil pour v1: x1,z1

la largeur de la scanline est donne par x1-x0, et tout ce qu'il y a a faire, c'est d'interpoler les Z le long de cette scanline...
par exemple, si y a:

x0 = 3
x1 = 7
z0 = 100
z1 = 160

dx = 4
(dc 4 pixels de large)
dz = 60

donc pour chaque pixel, il faudra ajouter z_inc = dz/dx, soit 60/4 = 15

donc par exemple, pour le premier pixel, la coord z = 100 + 15 = 115
pour le second, z = 115 + 15 = 130
pour le troisieme, z = 130 + 15 = 145
pour le 4eme, z = 145 + 15 = 160

vala smile
et c'est ces valeurs que tu dois tester dans le Z-Buffer smile
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

7

enfin, bien sur, avant, y faut interpoler les valeurs Z des trois sommets dans la routine de trace de triangles, et ensuite, envoyer ces valeurs au traceur de scanline appelle pour chaque ligne du triangle par le traceur de triangles...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

8

top ok merci, je devrai m'en sortir maintenant...

9

bah de rien smile
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

10

Argh j'arrive pas à déclarer un tableau pour le z_buffer sinon il me decalle la palette ou pire...ca affiche pas ou deformé.
Dès que je declare une variable, il decalle la palette...???
Je sais que je suis vague, mais comme j'ai rien changé d'autre que la ligne:
double zbuffer[240];
je dois faire une grossiere faute de newbee...???

11

Peut-être qu'il faut préciser la section?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

la je pe pas t'aider sad
par contre... heuuuu grin

"double" ? gringrin
tu comptes remplir ton Z-Buffer de floats? grin sur une GBA? grin
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

13

Ah oui, tiens, beurk, des flottants!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

14

Je comprend pas, avec des int c'est pire, la table de sin et de cos est effacé...
Si je déclare autre chose qu'un tableau c'est pareil...
Si j'essaye de charger autre chose qu'un cube je n'ai plus d'affichage...(peut-être donc un pbl dans ma fonction 'charger_asc')...
J'utilise 'convert.exe' de sbibi et Pya pour convertir les .asc en .h puis je le lis avec:
void ChargerASC()
{
int i,j;

j = 0;
Nb_points = World_points[0];
Nb_faces = World_Faces[0];

for (i=1 ; i<(Nb_points*3) ; i+=3) //charge les points
{
Sommet[j].x = World_points[i];
Sommet[j].y = World_points[i+1];
Sommet[j].z = World_points[i+2];
j++;
}
j = 0;
for (i=1 ; i<(Nb_faces*3) ; i+=3) // charge les vecteurs
{
Facette[j].a = World_Faces[i];
Facette[j].b = World_Faces[i+1];
Facette[j].c = World_Faces[i+2];
j++;
} }

Je viens de voir qu'il manque des faces à mon cube en wireframe (avant j'etais en gouraud alors je pensait à un problème de z clipping) et il ressemble à un 'Z'(la forme) en 3D...Elle est correcte ma fonction 'ChargerASC()' Sbibi?

15

bien sûr je modifie à la main le tableau dans cube.h pour ajouter les virgules, accollades des tableaux, ajouter 1 au nb de points et de faces (un bug du prg?) etc...

16

Pas de réponses...confusJ'espère que ça te dérange pas que j'utilise ton prog de convertion...?

17

tes gros tableaux tu les déclares const?
Vive le coding gba.
www.codegba.fr.st

18

Les tableaux de points et faces? ils sont déclarés en int
Faut les déclarer en const? je vais essayer...

19

en effets les gros tableaux d'entiers que tu ne modifis pas par la suite il faut les définir comme des const int
Vive le coding gba.
www.codegba.fr.st

20

Ok, merci,
J'ai trouvé mon erreur pour ce qui est de l'affichage des faces (ma fonction ChargerASC() plus haut n'etait pas en cause ,ça marche enfin avec le cube (uniquement)).
j'ai modifié les int des deux tableaux par des const mais cela n'a pas résolu le problème et je n'arrive toujours pas à déclarer un nouveau tableau:
int zbuffer[240][160];
Avec juste cette ligne, ça me décale apparement les valeurs des autres tableaux: http://gba.w.free.fr/test.zip

21

C'est vraiment bizarre: si je le déclare en char zbuffer[240][160]; ça marche mais impossible alors de le remplir completement sinon je perds l'affichage. J'essais de le remplir comme ça:
// Efface le contenu du z_buffer
for (i=0;i<238;i++){
for (j=0;j<158;j++}{
zbuffer[i][j]=0 ;
}
}
Avec des int je ne peux même pas déclarer le tableau z_buffer...il y a une limitation dans la création de tableaux? Faut-il réserver de la mémoire et comment?confus

22

J'ai enfin pus déclarer mon tableau en int , en enlevant tout les float et long du reste du code...Je pense que la GBA à une trop petite mémoire alloué au code...?
(Par contre impossible de travailler sur ce tableau en l'initialisant à 0 par exemple....)

Ca expliquerait pourquoi je n'arrive pas à charger les objets qui ont plus de sommets que mon cube....Je suis sur la bonne voie smile