Initialiser les vertex dans une boucle for

Signaler
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010
-
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010
-
salut a tous

j'avance a petits pas dans la création d'un jeu 3d.
je voulais faire un grand sol de plein de petits carré. Pour ca, (même technique que pour les jeux avec les tiles) je voulais utiliser deux boucles for imbriquées pour créer les vertex

ca donne :
VERTEX vertices[10000];  // un tableau de vertices
int i,j;
int nb = 0;
for(i=0; i<10; i++)
{
      for(j=0; j<10; j++)
      {
            vertices[nb].x = (je détaille pas... c'est des coordonnées basiques...)
            vertices[nb].y = ........
            vertices[nb].z = ........
            vertices[nb].color = 0xffffff00;
            nb++;
      }
}

et la il me dit erreur de mémoire quand je lance le programme ! on ne peut donc que faire :
VERTEX vertices = {{x,y,z,color},{x,y.....}, .......};
??

merci d'avance !
a+

12 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
26
Essaye de faire :
VERTEX * vertices = malloc(sizzeof (VERTEX)* 10000). si tu est en c
ou
VERTEX * vertices = new VERTEX[10000]; si tu est en c++

Apres la ligne précédente, tu verifier que l'a mémoire est bien allouée if(vertex == NULL)

et a la fin un petit free(vertices); en c ou delete [] vertices. en C++

++
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Mais ton code est correct. Seul ton tableau doit faire exploser la pile.

Il faut déclarer ton tableau de la facon suivante:

VERTEX  * vertices = new VERTEX[10000];


Oublie pas un delete[] quand t'as plus besoin du tableau.


Je suppose que c'est une erreur de recopiage : tes indices dans tes boucles sont de 10 au lieu de 100.


Remarque: une couleur entière, ca m'étonnerait que directx travaille avec ca par défaut.
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010

merci pour les réponses,
maintenant y'a plus l'erreur de mémoire mais on ne voit plus les vertices... 
pourquoi ca fait ca? vous allez pas me dire que tous le monde initialise ces vertices comme ca:
VERTEX vertices[] = {.....................};

y'en a bien qui font vertices[0].x =... non?

http://perso.orange.fr/site.animation/main.cpp
voilà mon code, y'a plein de truc en bleu, c'est les différents essais...

voilà, si vous pouviez m'aider svp !
merci
a+
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010

ps: je suis en c++
Messages postés
15208
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
17 janvier 2022
101
coucou!
J'ai regardé vite fait ton code. Dans la fonction InitBuffer(), tu fais un memcpy avec un sizeof(vertices). Or, vertices est un pointeur, donc la taille sera toujours 4. Il faut faire:
memcpy(buf, vertices, NB_VERTICES*sizeof(VERTEX));

Et pour info, dans ta double boucle d'init (qui, en passant, est vide), au lieu de trainer un nb de vertex, je te conseille de faire ceci, plus lisible:
for (i=0; i<nbLignes; i++)
{
  for (j=0; j<nbColonnes; j++)
  {
    vertices[i*nbColonnes+j].x=...;
  }
}

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010

ok, merci pour ta réponse !
mais j'ai refait la méthode VERTEX vertices[100];
plutot que =new...
et ca marche sauf qu'il faut que je mette au minimum
VERTEX vertices[500];
avec moins, le programme quitte dès le démarrage, comment ca se fait? je n'ai pourtant besoin que de 100emplacements?
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010

http://perso.orange.fr/site.animation/main.cpp

revoila le code, pouvez vous me dire ce qui va et ne va pas (surtout lol)

a+
Messages postés
15208
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
17 janvier 2022
101
A chaque parcours de boucle, tu appelles 6 fois la fonction add(), donc tu ajoutes 5 vertices. Or, tu le fais 10x10=100 fois donc il te faut, au minimum 500 vertices.
D'ailleurs, pourquoi 6? tu ajoutes 2x les mêmes 2 sommets: (j,i) et (j+2,i+2). Essaies de faire un truc comme ceci (à vérifier dans ton système de coordonnées pour les i et les j)

int nbLignes=10;
int nbColonnes=10;
VERTEX vertices[100];
int i=0;
int j=0;
for (i=0; i<nbLignes; i++)
{
  for (j=0; j<nbColonnes; j++)
  {
    vertices[i*nbColonnes+j].x=j;

    vertices[i*nbColonnes+j].y=0;

    vertices[i*nbColonnes+j].z=i;

    vertices[i*nbColonnes+j].color=0xffffff00;

  }
}

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Déclare ton tableau dans le tas:

VERTEX * vertices = new VERTEX[NB]


et non dans la pile, sauf si tu tiens absolument a voir ton programme planter quand tu augmenteras le nombre de vertex.


De toute facon, c'est n'importe quoi de déclarer des gros objets dans la pile.
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010

ben je croyais que les vertices allait par trois? d'ailleurs :
device->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*3, 1);
ne dessine-t-il pas les vertex par triangles? c'est pour ca que je croiyait qu'il fallait un multiple de trois pour nombre de vertice ! éclairez moi la dessus svp ^^

pour le tableau dans le tas ou non, ce n'étais pas un choix de ma part, c'est juste que je m'étonnais que ca marche aussi non sur le tas. Et puisque moins y'a des signes bizarres mieu je comprend (je sais c'est qu'un pointeur mais bon). Mais si tu dis que ca va planter quand y'aura plus de vertices, ok j'ai fait les modifs
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Avec des triangles en "strip" (sque tu fais), n'importe quel nombre de
vertex convient. Avec des triangles "classique" (cad 3 vertex /
triangles), il faut nécessairement une multiple de 3 sinon le dernier
triangle sera pas (ou mal) afficher.


Mais de toute facon, faut pas utiliser des vertex buffers classique,
mais des vertex buffers indexés (bcp plus rapide). Mais comme je
programme pas avec directx, jpeux rien de dire de plus.
Messages postés
98
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
4 novembre 2010

ah, ca c'est ennuyeux, tu me lance sur une nouvelle piste mais sans indications...

sinon, j'en profite pour poser une question plus générale. Dans tous les tutoriaux qu'ont peux trouver, y'en a pas un qui disent plus ou moins la même chose. Si je comprend bien, dans l'initialisation de direct 3d, il faut :
1. créer "l'objet 3d" par Direct3DCreate9(D3D_SDK_VERSION)
2. récupérer le mode d'affichage avec objet3D->GetAdapterDisplayMode(...)
3. parametrer des "trucs" pour la création d'un device avec objet3D->CreateDevice(....) (j'ai pas encore bien défini ce que c'était dans mon ptit cerveau )
4. la, y'a les SetRenderState non? mais lesquels faut-il mettre? 
         device->SetRenderState(D3DRS_ZENABLE, TRUE) ??
        device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ) ??
        device->SetRenderState( D3DRS_LIGHTING, FALSE)  ??
         les trois??

 et si je ne me trompe, c'est la fin de l'initialisation ?

si ca vous dérange que je fasse un récapitulatif comme ca, dites-le

merci d'avance !
a+