Page 1 sur 5
Questions pour créer un loader B3D
Publié : mer. 11/oct./2006 10:16
par Progi1984
Salut à tous, je travaille sur un loader B3D (avant de m'attaquer à d'autres formats). j'ai réussi à dumper le fichier B3D. Mtnt j'essaie de l'afficher, mais dés que je crée le mesh, j'ai un IMAà la ligne 257.
File:1->
MGEB3DLoader.zip
Tous les fichier B3D :
B3DSamples.zip 8Mo
Publié : mer. 11/oct./2006 10:29
par tmyke
Perso cela s'arrete a la ligne
CreateMesh(0,n_verts*3)
Je ne connais pas trop bien les instruction 3D native de PB, mais je regarde
et je te tiens au courant...
Publié : mer. 11/oct./2006 10:39
par Progi1984
C'est cette ligne-là ! Merci !
Publié : mer. 11/oct./2006 10:57
par tmyke
J'ai placé les appels B3D après l'init de l'ecran graphique.
Cette fois j'arrive sur un message d'erreur ligne 289
SetMeshData(0,#PB_Mesh_Vertex,@Vertices(),n_verts*3)
en passant comme parametre
SetMeshData(0,#PB_Mesh_Vertex,@Vertices(),n_verts)
cela se termine sans arret violent.
En lisant la doc, il y a une embiguité entre
CreateMesh(0, Taille) ou 'Taille' est la taille du Mesh (mais en quoi ?)
et
SetMeshData() ou le dernier paramètre est le nombre de sommets...
Dans ce cas le nombre de sommet est n_verts je pense et non pas
n_verts*3 qui dans ce cas est la taille du tableau 'Vertices'
Publié : mer. 11/oct./2006 11:03
par Progi1984
Parfait ! Merci !
Publié : mer. 11/oct./2006 11:13
par Progi1984
J'ai mis à jour le zip... et j'ai toujours un problème.
Je charge les sommets et les triangles.
Mais rien ne s'affiche... j'ai du lourder quelque part !
Publié : mer. 11/oct./2006 11:20
par comtois
Progi1984 a écrit :Parfait ! Merci !
Ah ça marche maintenant ?
parce que ça me parait curieux ce bout de code
Code : Tout sélectionner
Dim Vertices(n_verts*3)
Protected Inc_vert=0
;read all verts in chunk
While b3dChunkSize()
x.f = b3dReadFloat()
Vertices(Inc_vert) = x
Inc_vert+1
y.f = b3dReadFloat()
Vertices(Inc_vert) = x
Inc_vert+1
z.f = b3dReadFloat()
Vertices(Inc_vert) = x
Déjà ton tableau n'utilise pas de structure, après tout pourquoi pas, mais ça serait plus parlant avec une structure.
Ensuite c'est un tableau d'entier , c'est plutôt rare en 3D, en principe les coordonnées des vertices sont en flottant, ensuite tu recopies la même valeur 3 fois ? ça ne devrait pas être x,y et z ?
Pour la taille du CreateMesh() il faut indiquer la dimension du mesh.
C'est chiant ce truc là , on ne l'avait pas avant.
ça devrait être à la fonction de le calculer ! après tout la fonction a accès aux données, elle peut déterminer elle même la dimension du mesh en analysant les coordonnées mini maxi.
Bref si tu ne connais pas la dimesion du mesh , tu peux mettre 1000, ça n'a d'influence que sur l'affichage à l'écran.
Ensuite
ça ne suffit pas, il faut aussi définir les triangles avec un autre SetMeshData() et #Pb_Mesh_Face
Et tu mets ton SetmesData() dans une boucle ? dans la boucle il faut mémoriser toutes les données du mesh ,et seulement après tu construits le mesh en une fois, mais j'ai pas étudié plus que ça, c'est peut-être correct ce que tu as fait.
Publié : mer. 11/oct./2006 11:33
par tmyke
Comtois a raison, j'ai ecris plutot cela, et cela marche, je vois le zombie
Code : Tout sélectionner
Dim Vertices.f(n_verts*3)
Protected Inc_vert=0
;read all verts in chunk
While b3dChunkSize()
x.f = b3dReadFloat()
Vertices(Inc_vert) = x
Inc_vert+1
y.f = b3dReadFloat()
Vertices(Inc_vert) = y
Inc_vert+1
z.f = b3dReadFloat()
Vertices(Inc_vert) = z
Publié : mer. 11/oct./2006 11:33
par Progi1984
Grace aux infos de Comtois, j'ai réussi à afficher mon bonhomme.
Mtnt, je continue par la texture. Mais il faut que j'améliore d'abord mon code !
Publié : mer. 11/oct./2006 15:38
par Progi1984
Bon, bah la texture est chargée mais en fait, il faut charger les coordonnées UV et c'est là que ca me pose problèmes
- je voie où les charger (ligne 305)
- mais dés que j'essaie de les charger ! Paf : aucun effet !
J'ai MAJ le zip tout en haut ! Donc si il y en a qui sont prets à m'aider... pas de problème

Publié : mer. 11/oct./2006 18:31
par comtois
dans ton dernier zip on est censé le voir ton zombi ? moi je ne vois rien.
sinon pour les coordonnées uv
il faut ajouter deux paramètres dans ta structure
Code : Tout sélectionner
; Coordonnées UV
For j = 0 To tc_sets-1 ;texture coords per vertex - 1 for simple uv, 8 max
For k = 1 To tc_size ;components per set - 2 for simple uv, 4 max
b3dReadFloat() ; ici il faudrait lire Vertices\u() et Vertices\v()
Next
Next
Wend
SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_UVCoordinate,@Vertices(),n_verts)
il faut ajouter #PB_Mesh_UVCoordinate, et mémoriser les valeurs de u et v dans ton tableau Vertices()
Publié : jeu. 12/oct./2006 5:10
par tmyke
Comme dit Comtois, il faut intégrer les coordonnées de textures dans la structure Vertex.
Et dans la boucle de VRTS, il faudrait ecrire un truc comme ça
Code : Tout sélectionner
Dim Vertices.S_Vertices(n_verts)
Protected Inc_vert=0
;read all verts in chunk
While b3dChunkSize()
x.f = b3dReadFloat()
y.f = b3dReadFloat()
z.f = b3dReadFloat()
With Vertices(Inc_vert)
\x = x
\y = y
\z = z
EndWith
If flags & 1
nx.f = b3dReadFloat()
ny.f = b3dReadFloat()
nz.f = b3dReadFloat()
EndIf
If flags & 2
red.f = b3dReadFloat()
grn.f = b3dReadFloat()
blu.f = b3dReadFloat()
lfa.f = b3dReadFloat()
EndIf
; Coordonnées UV
Dim uv.f(8,4)
For j = 0 To tc_sets
For k = 0 To tc_size
uv(j,k)= b3dReadFloat()
Next
Next
With Vertices(Inc_vert)
\u = uv(0,0)
\v = uv(0,1)
EndWith
Inc_vert+1
Wend
SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_UVCoordinate,@Vertices(),n_verts)
Else
Debug tab+"***** Illegal number of vertices *****"
EndIf
La je pars bosser, mais en rentrant je reprend (en espérant pas rentrer dans la nuit)...
A+
PS: en C/C++ voila comment c'est écris (si ça peut t'aider)
Code : Tout sélectionner
char* b3d_getVRTS_Dat(char* fp, int* decision)
{
float tex_coord[8][4];
float nx,ny,nz,r=1.0,g=1.0,b=1.0,a=1.0;
int flags=*((int*)fp);fp+=4;*decision-=4;
int texcoordsets=*((int*)fp);fp+=4;*decision-=4;
if(texcoordsets>FVF_format) FVF_format = (short)texcoordsets;
int texcoordsetsize=*((int*)fp);fp+=4;*decision-=4;
while(*decision)
{
float x=*((float*)fp);fp+=4;*decision-=4;
float y=*((float*)fp);fp+=4;*decision-=4;
float z=*((float*)fp);fp+=4;*decision-=4;
if(flags&1)
{
nx=*((float*)fp);fp+=4;*decision-=4;
ny=*((float*)fp);fp+=4;*decision-=4;
nz=*((float*)fp);fp+=4;*decision-=4;
}
if(flags&2)
{
r=*((float*)fp);fp+=4;*decision-=4;
g=*((float*)fp);fp+=4;*decision-=4;
b=*((float*)fp);fp+=4;*decision-=4;
a=*((float*)fp);fp+=4;*decision-=4;
}
for(int n=0;n<texcoordsets;++n)
for(int i=0;i<texcoordsetsize;++i)
{
tex_coord[n][i] = *((float*)fp);
fp+=4;*decision-=4;
}
// mémorisation du vertice, après transformation
D3DXVECTOR3 pt = D3DXVECTOR3(x,y,z);
D3DXVec3TransformCoord(&pt, &pt, &mat_entity);
vtx8[nbre_vertex].p = pt;
vtx8[nbre_vertex].n = D3DXVECTOR3(nx,ny,nz);
vtx8[nbre_vertex].color = D3DXCOLOR(r,g,b,a);
vtx8[nbre_vertex].u[0] = tex_coord[0][0];
vtx8[nbre_vertex].u[1] = tex_coord[0][1];
vtx8[nbre_vertex].u[2] = tex_coord[1][0];
vtx8[nbre_vertex].u[3] = tex_coord[1][1];
vtx8[nbre_vertex].u[4] = tex_coord[2][0];
vtx8[nbre_vertex].u[5] = tex_coord[2][1];
vtx8[nbre_vertex].u[6] = tex_coord[3][0];
vtx8[nbre_vertex].u[7] = tex_coord[3][1];
vtx8[nbre_vertex].u[8] = tex_coord[4][0];
vtx8[nbre_vertex].u[9] = tex_coord[4][1];
vtx8[nbre_vertex].u[10]= tex_coord[5][0];
vtx8[nbre_vertex].u[11]= tex_coord[5][1];
vtx8[nbre_vertex].u[12]= tex_coord[6][0];
vtx8[nbre_vertex].u[13]= tex_coord[6][1];
vtx8[nbre_vertex].u[14]= tex_coord[7][0];
vtx8[nbre_vertex].u[15]= tex_coord[7][1];
nbre_vertex++;
}
Publié : jeu. 12/oct./2006 8:10
par Progi1984
J'a mis à jour le ZIP.
Ca marche, merci à vous (TMyke & Comtois) mais le problème est que les UV sont pourris. Car cela applique mal les UV au modèle.
Publié : jeu. 12/oct./2006 8:29
par comtois
la boucle k doit commencer par 0
pour le -1 je ne sais si c'est utile ,tu verras bien.
Publié : jeu. 12/oct./2006 8:38
par Progi1984
Merci, c'est parfait...
Petite question pour le SetMeshData :
Au lieu d'utiliser des tableaux, peut on utiliser des listes chaînées ?