Page d'accueil
3D
VRML
Déplacement
Exemple
Cadeaux
Visiter
Déplacement

La gestion des liens entre les différentes Caméras s’effectue au moment de la création des Objets. En effet, on ajoute aux attributs d’une Caméra une liste de liens appelés ‘fils’. On crée ainsi un arbre. La gestion du déplacement depuis n’importe quelle pièce du monde 3D impose un retour d’information. Comme il n’existe pas de notion de père pour une caméra – chaque trajet imposant ses propres pères – à la création d’un nœud, il faut impérativement indiquer aux fils de ce nœud sa présence. On ajoute donc le nœud à la liste de liens des fils.

void Ajouter(FILE * f, int id, /* ATTRIBUTS */, int fils[NbFils])
{
    int i, j;
    Noeud c;
   
/* Traitement des attribus pour le nœud C */
    /* Ecriture du noeud dans le fichier de sauvegarde */
    fseek(f,(id-1)*sizeof(Noeud),0);
    fwrite(&c,sizeof (Noeud),1,f);
   
/* Recherche des fils du noeuds */
    for (i = 0; (i < NbFils) && (fils[i] != EstVide); i++)
    {
        fseek(f,(fils[i]-1)*sizeof(Noeud),0);
        fread(&c,sizeof(Noeud),1,f);
        j = 0;
        while ((j<NbFils) && (c.FILS[j]!=EstVide) && (c.FILS[j]!=id)) j++;
       
/* On cherche une place vide dans sa liste de liens */
        if(j != NbFils)
        {
                c.FILS[j] = id;
               
/* Ecriture du fils avec les nouvelles informations */
                fseek(f,(fils[i]-1)*sizeof(Noeud),0);
                fwrite(&c,sizeof(Noeud),1,f);
        }
    }
}


La gestion du parcours dans notre monde 3D a longuement posé problème. C’est avec la structure ci-dessus que nous est venu la solution : Un tableau du nombre de Caméra indique pour chaque Caméra son père. Bien entendu, ce tableau est valable pour une salle. De cette façon, étant à la Caméra i, on doit se rendre à la Caméra A[i] et réitérer le procédé tant que nous ne sommes pas arrivé dans la salle en question.

void OrganiserUnTableau(FILE * f, int A, int P, float l, int T[NbSalle], float L[NbSalle])
{
    float d;
    Noeud Na, Nf;
    int i, a;
   
/* Si P == -1 la caméra A sera considéré comme dans la salle */
    if(P == -1) T[0] = A;
   
/* Ce trajet de P à A sera intéressant si c'est la première fois que l'on arrive en A ou bien que le trajet trouvé précédemment pour arriver en A depuis notre salle est plus long que celui en cours */
    if(T[A] == EstVide || L[A] > l)
    {
         T[A] = P;
         L[A] = l;
        
/* Recherche des informations du noeud en cours */
         fseek(f,(A-1)*sizeof(Noeud),0);
         fread(&Na,sizeof(Noeud),1,f);
        
/* Recherche des fils du noeud en cours */
         for(i = 0; (i < NbFils) && (Na.FILS[i] != EstVide); i++)
         {
               
/* Recherche des informations du fils */
                fseek(f,(Na.FILS[i]-1)*sizeof (Noeud),0);
                fread(&Nf,sizeof(Noeud),1,f);
               
/* Calcul de la distance entre le noeud et son fils */
                d = pow(Na.X-Nf.X,2) + pow(Na.Y-Nf.Y,2) + pow(Na.Z-Nf.Z,2);
                d = sqrt(d)+l;
               
/* Itération pour le trajet suivant */
                OrganiserUnTableau(f,Nf.ID,Na.ID,d,T,L);
         }
    }
}

Mais tout cela serait plus clair avec cet exemple.

[Page d'accueil] [3D] [VRML] [Déplacement] [Exemple] [Cadeaux] [Visiter]