Initialiser les vertex dans une boucle for

StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010 - 11 sept. 2006 à 21:05
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010 - 12 sept. 2006 à 19:06
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

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 24
11 sept. 2006 à 21:50
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++

++
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 sept. 2006 à 21:54
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.
0
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010
12 sept. 2006 à 07:45
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+
0
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010
12 sept. 2006 à 07:50
ps: je suis en c++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
12 sept. 2006 à 09:28
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
0
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010
12 sept. 2006 à 09:43
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?
0
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010
12 sept. 2006 à 09:44
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+
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
12 sept. 2006 à 10:35
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
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
12 sept. 2006 à 13:37
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.
0
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010
12 sept. 2006 à 18:49
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
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
12 sept. 2006 à 18:57
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.
0
StrikerFred Messages postés 98 Date d'inscription mercredi 12 octobre 2005 Statut Membre Dernière intervention 4 novembre 2010
12 sept. 2006 à 19:06
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+
0
Rejoignez-nous