Questions pour créer un loader B3D

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

non , il faut un bloc mémoire , soit par un tableau ou un allocatememory.

j'ai vu que tu avais mis un rotateEntity() dans ta boucle
le rotate est absolu, il faut faire varier l'angle

Code : Tout sélectionner

      a + 1
      RotateEntity(1, a, 0, 0)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Mise à jour de mon loader...
- Textures ok
- Gestion de plusieurs chunk TRIS pour un mesh

- Question 1 :
Par contre, le problème est qu'un B3D peut contenir plusieurs meshs. Comment pourrais je gérer ca dans mon loader ?

- Question 2 :
J'ai essayé de gérer le triangles et les sommets (+UV) par allocation mémoire, mais j'ai pas réussi... donc si il y en a qui veulent participer.
Anonyme

Message par Anonyme »

Voici ce que j'avais fait :

j'ai une structure MESH :

Code : Tout sélectionner

Structure MESH
  Vertice_Memory.l
  Face_Memory.l
  UV_Memory.l
EndStructure

Vertice_Memory Contient l'adresse memoire d'une liste de vertex.
Admetons que l'on a un cube comme mesh avec 4 frames d'animations.
Ca nous fait au total 8 vertices (le cube) * 4 (frames)
Donc en memoire ca nous donne 8*4*3 en taille (96 octets)
le 3 correspond au X,Y,Z.

Tu sais qu'il faut faire un + (8*3) dans la mémoire pour changer de frame sur le premier vertex. etc...


Et pour obtenir l'adresse je fait comme ca :


Mon_Mesh.Mesh
Mon_Mesh\Vertice_Memory = Chargevertice("Objet.xxx")

Ensuite je me ballade dans Mon_Mesh\Vertice_Memory pour trouvé la position des vertices.
Pareil pour les faces , uv , etc...

J'éspère que tu m'a compris.

@++
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Excuse moi ! TU essaies de m'expliquer quoi ?

Comment gérer l'animation ?

As tu un exemple de ce que tu avais fait (code et/ou EXE) plz ?
Anonyme

Message par Anonyme »

- Question 1 :
Par contre, le problème est qu'un B3D peut contenir plusieurs meshs. Comment pourrais je gérer ca dans mon loader ?
Une seule zone mémoire suffit par B3D ((Nombre de Vertice * 3) * Nbr_frame)

Quand tu dit que dans le B3D il y a plusieurs Mesh, c'est le meme mesh ? ou c'est un peu comme une scene .max ?

la question 2 rejoins la Question 1.

Et non, je n'ai aucun exemple concret à te donner. j'ai tout perdu et rien recodé.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

En fait, il a plusieurs fois le chunk mesh (donc je pense comme dans Max).

Retélécharge le zip... (premier post)
et regarde dans le dossiers B3DSamples\MultiMesh, le fichier flingue.B3D, tu as un exemple !
Anonyme

Message par Anonyme »

Pas evident ton code :?
Sinon , si c'est comme dans max, tu dois avoir des mesh différent des uns des autres.

Donc, a chaque fois tu as fini de parser un mesh dans ton fichier, tu appelle SetMeshData() en lui passant le tableau des vertices, et tu remet tout à 0, et tu recommence, j'usqu'a qu'il n' y a plus de mesh dans le fichier.

Car là, ton problème est que tu appelle qu'une seule fois setmeshdata().
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Pas fini d'être prise de tête ! :P
J'étudie ce que tu viens de me dire !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Cpl.Bator a écrit :Pas evident ton code :?
Sinon , si c'est comme dans max, tu dois avoir des mesh différent des uns des autres.

Donc, a chaque fois tu as fini de parser un mesh dans ton fichier, tu appelle SetMeshData() en lui passant le tableau des vertices, et tu remet tout à 0, et tu recommence, j'usqu'a qu'il n' y a plus de mesh dans le fichier.

Car là, ton problème est que tu appelle qu'une seule fois setmeshdata().
Pas évident mon code ? Pourquoi ? Que veux tu que je t'explique ?
Je vais essayer de le nettoyer un peu !

Sinon pour ta technique je vois et je comprends ! Mais quel numéro de mesh renvoyé alors à l'utilisateur aprés la création pour qu'il travaille ? Car lors de la création de son entity, il ne peut spécifier qu'un mesh... idem pour les materials !

[Edit 15:15] J'ai mis à jour le fichier (nettoyrage du code)
Rappel du lien :
MGEB3DLoader.zip
Image
Anonyme

Message par Anonyme »

te casse pas la tete à expliquer, j'ai compris.

Imagine que c'est un fichier B3D quelquonque Contenant plusieur mesh (ici 2)

Mesh A
{
Vertex 0 100,100,100
Vertex 1 -100,0,100
Vertex 2 100,100,0
Vertex 3 0,100,100

FACE 0 0,1,2,3
FACE 1 1,0,3,2
}

Mesh B
{
Vertex 0 200,200,200
Vertex 1 -200,0,200
Vertex 2 200,200,0
Vertex 3 0,200,200

FACE 0 0,1,2,3
FACE 1 1,0,3,2
}

Chaque objet à donc des vertices et des faces bien propre à chaque objet
si tu charges donc tout les meshs (ici le A & le B) il va y avoir comme un conflit entre les faces et les vertices, car certain on le meme numéro.
Ce qu'il faut que tu fasses, c'est décalé les numéros du mesh suivant de + "nombre_vertices_charger"

C'est à dire que dans notre exemple le mesh B aura ces numéros :

Vertex 4 200,200,200
Vertex 5 -200,0,200
Vertex 6 200,200,0
Vertex 7 0,200,200

idem pour les faces, il faut qu'elle pointes sur les bon vertices
Comme ca ca fait un mesh unique de 8 vertices , tu n'a plus qu'a renvoyé qu'un seul identifiant.
J'éspère que tu m'as compris :D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Ouaip, je vois ce que tu veux dire !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Avant de continuer, je voudrais remercier Comtois, Cpl Bator & TMyke de leur aide, tant pour m'expliquer mes erreurs que pour réfléchir à comment je pourrais faire.

Donc grace aux derniers conseils de Cpl Bator : j'ai réussi à charger le flingue : mais je buggue sur un autre fichier B3D qui devrait pourtant bien se charger.

Fichier B3D : Box2.B3D
Fichier ZIP mis à jour un peu plus haut !


PS : Je ne me suis pas encore attaqué aux textures !
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

rien à dire si ce n'est bon courage et merci de partager le travail effectué.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Merci beaucoup...
Anonyme

Message par Anonyme »

Donc grace aux derniers conseils de Cpl Bator : j'ai réussi à charger le flingue : mais je buggue sur un autre fichier B3D qui devrait pourtant bien se charger.
C'est chiant ca, moi aussi j'ai eu ce genre de problème , verifie bien qu'il n'y a pas de décalage lors du comptage de vertices et de faces, je ne sais pas si tu peut savoir d'avance combien le mesh aura de face, peut être dans l'entête du fichier, Compare les valeurs, si tu as un décalage entre ta valeur et celle donnée par le fichier, alors il y a un problème dans le parsing du fichier.
Il se peut aussi que le fichier soit bugé ( ca m'est arrivé avec un model de max)

Sinon, essaye de charger plusieurs petit mesh, tu trouveras plus facilement ou est le bug.
affiche aussi le numéro (l'index du vertex) , ainsi que les coordonées à l'écran , et compare les valeur affiché avec le fichier, t'es pas à l'abris d'un décalage dans ton comptage.

Sinon, bon courage, car c'est la partie la plus chiante d'un moteur 3D :D

@++
Répondre