Creer des meshs - précisions

Généralités sur la programmation 3D
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Creer des meshs - précisions

Message par Aranoth »

Bonjour,

je m'était promis de m'accorder le week end pour regarder un peu mieux la 3D de PureBASIC (j'ai voulu me remettre à la 3D...mais une foix qu'un a gouté au PureBASIC impossible de se remettre au DarkBASIC ^^), alors je me suis interessé un peu à tout avec des recherches.

J'avais déjà vu les concepts de terrain (pas très satisfaisant pour ce que je veux faire), alors j'ai matté les Matrices de Comtois (nickel :) ), j'ai regardé les lumières et les materials, plus qu'un truc...

les meshs...

Je sais qu'il est possible d'exporter avec Milkshape3D, mais pour le moment j'aimerait savoir comment ils marchent.

Code : Tout sélectionner

SetMeshData(#Mesh, Type, Data, LongueurData)
C'est surtout à cette commande que je m'interesse
Change les données internes de la #Mesh. 'Data' est l'adresse mémoire à laquelle se trouve les données à insérer dans la #Mesh. 'LongueurData' est la longeur de ces données, en fonction du 'Type' choisi
j'ai regardé les exemples de Comtois, et je me retrouve avec ca:

Code : Tout sélectionner

;{- Datas Cube
DataSection
;/Cube
CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
CubeNormales:
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5

Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0

CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15
CubeTextures:
;original
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1

Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
EndDataSection
Je ne me suis jamais vraiment penché sur les datas mais je sais comment ils fonctionnent

le truc c'est que j'aimerait avoir quelques précisions dessus, histoire de comprendre comment ca marche. (SVP pas de renvoie sur des docs anglaises, mes traductions veulent souvant dire l'inverse de l'original :cry: )

Merci à vous :wink:
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

J'ai un peu avancé dans mon résonnement, concernant les POINTS (vertexs)

Code : Tout sélectionner

Data.f -0.5,-0.5,-0.5
devrait definir la position d'un point

Le problème c'est que le cube de Comtois utilise 16 definitions comme celles ci, j'ai enlevé les definitions superflues et je me retrouve avec un contour epais de cube...

une petite image (ouais bon c'est bancale mon image :roll: )
Image

A qui servent les autres points alors ?


EDITION

Code : Tout sélectionner

CubePoints:
Data.f -0.5,-0.5,-0.5 ;Face inferieure
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5  ;Face supérieure
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

;Data.f -0.5,-0.5,-0.5 ; Réplique de la face inférieure !!
;Data.f -0.5,-0.5,0.5
;Data.f 0.5,-0.5,0.5
;Data.f 0.5,-0.5,-0.5

;Data.f -0.5,0.5,-0.5 ; Replique de la face supérieure !!
;Data.f -0.5,0.5,0.5
;Data.f 0.5,0.5,0.5
;Data.f 0.5,0.5,-0.5
En faite la deuxieme série n'est qu'un double !
Quel interet de la mettre alors ? 8O (Hein Comtois ?^^)



Donc ce problème résolus (seul d'ailleurs lol), je m'attaque aux faces :wink:
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je vais peut etre te dire une betise !

il me semble me souvenir qu'en 3D la face visible d'une face est donné par la normale de cette face (polygone) !!

lorsque tu retourne une face cree elle disparait !!

donc je suppose que comtois a cree des faces "doubles" pour qu'elles puissent se voir des 2 cotés !! au cas par exemple ou le cube serait transparent !!


(je suis pas sur d'etre clair la :!!! :lol: )


:D
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Si justement je vois ce que tu veut dire, mais à part les cubes semi-transparents je vois pas l'utilitée^^

je vais faire avec au début, mais j'aimerait bien quand meme savoir comment ca marche tout ca :?

Merci
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Tiens un bon résumé sur ce qu'il faut savoir

http://purebasic.myforums.net/viewtopic.php?t=11527

Sinon pour l'explication des datas de ce cube ( tu peux le faire autrement ) j'avais tout détaillé sur le musée , je ne sais plus dans quelle section .

Si les points te semblent redondants , c'est uniquement pour la texture , de façon à répéter le motif de la texture sur les 6 faces du cube .

Si mes souvenirs sont bons , les datas sont issues de la primitive Box de darkbasic .
J'avais fait un petit code pour récupérer les datas des objets .x et 3ds ainsi que les primitives .Bref tous les formats qui peuvent être chargés par darkbasic . Si ça t'intéresse et que je retrouve le code source , je peux te le filer .C'est pas très compliqué à faire avec les memblock .
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Merci Comtois, je vais regarder "Some tips for SetMeshData() and Ogre" et fouiller le musée (qui que j'avais rien trouvé à ma première recherche)


Si mes souvenirs sont bons , les datas sont issues de la primitive Box de darkbasic .
J'avais fait un petit code pour récupérer les datas des objets .x et 3ds ainsi que les primitives .Bref tous les formats qui peuvent être chargés par darkbasic . Si ça t'intéresse et que je retrouve le code source , je peux te le filer .C'est pas très compliqué à faire avec les memblock .
ouais ca m'interesserait bien :)
Comme ca je pourrait faire un exporteur de mesh DarkBASIC :wink:

merci
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Voila tu pourras l'améliorer à ta convenance . Si tu as besoin d'explications ,n'hésite pas .

Code : Tout sélectionner

REm renseigner les deux fichiers ici
FichierX$="Arrow5.x"       : Rem nom du fichier à convertir ( préciser le chemin si nécessaire ou le copier dans le répertoire )
FichierMesh$="Fleche.msh" : Rem nom du fichier Datas pour purebasic

Rem le programme utilise l'object 1
Rem pour obtenir un object , on peut le créer soit avec les primitives de dark, soit en chargeant un fichier .x ou .3ds .
Rem Utilisez les deux lignes ci dessous pour sélectionnez quel type d'object vous allez utiliser 

Rem validez cette ligne pour charger un fichier ( ne pas oubliez de commenter la ligne suivante )
load object FichierX$,1
Rem Validez cette ligne pour créer un object à l'aide des primitives ( ne pas oubliez de commenter la ligne précédente )
rem make object cube 1,1

make mesh from object 1,1
make memblock from mesh 1,1
Backdrop off

print "Nombre de points " ,memblock Dword(1,0)
print "offset en octet DATA points " ,memblock dword(1,4)
print "Nombre de normal " ,memblock Dword(1,8)
print "offset en octet DATA normal " ,memblock dword(1,12)
print "Nombre de triangles " ,memblock Dword(1,16)
print "offset en octet DATA triangles " ,memblock dword(1,20)
print "Taille des triangles " ,memblock Dword(1,24)
print "offset en octet DATA UV texture " ,memblock dword(1,28)

if file exist(FichierMesh$) then delete file FichierMesh$
open to write 1,FichierMesh$
write string 1,"DataSection"

Rem affiche le header
write string 1,"Entete:"
write string 1,"Data.l "+str$(memblock Dword(1,0))+" ; Nombre de Points"
write string 1,"Data.l "+str$(memblock Dword(1,8))+" ; Nombre de Normales"
write string 1,"Data.l "+str$(memblock Dword(1,16))+" ; Nombre de Triangles"

Rem affiche les points
write string 1,"Points:"
adresse =memblock dword(1,4)
For a=0 to memblock Dword(1,0)-1
   x#=int(memblock float(1,adresse  )*1000000)/1000000.0
   y#=int(memblock float(1,adresse+4)*1000000)/1000000.0
   z#=int(memblock float(1,adresse+8)*1000000)/1000000.0
   write string 1,"Data.f "+str$(x#)+","+str$(y#)+","+str$(z#)
   inc adresse,12
next a

Rem affiche les normales
write string 1,"Normales:"
adresse =memblock dword(1,12)
For a=0 to memblock Dword(1,8)-1
   x#=int(memblock float(1,adresse  )*1000000)/1000000.0
   y#=int(memblock float(1,adresse+4)*1000000)/1000000.0
   z#=int(memblock float(1,adresse+8)*1000000)/1000000.0
   write string 1,"Data.f "+str$(x#)+","+str$(y#)+","+str$(z#)
   inc adresse,12
next a

Rem affiche les triangles
write string 1,"Triangles:"
adresse =memblock dword(1,20)+4
For a=0 to memblock Dword(1,16)-1
   write string 1,"Data.w "+str$(memblock dword(1,adresse))+","+str$(memblock dword(1,adresse+8))+","+str$(memblock dword(1,adresse+16))
   inc adresse,28
next a

Rem affiche les textures
write string 1,"Textures:"
adresse =memblock dword(1,28)
For a=0 to memblock Dword(1,0)-1
   u#=int(memblock float(1,adresse    )*1000000)/1000000.0
   v#=int(memblock float(1,adresse + 4)*1000000)/1000000.0
   write string 1,"Data.f "+str$(u#)+","+str$(v#)
   inc adresse,8
next a
   write string 1,"EndDataSection"
close file 1

wait key

delete memblock 1
delete mesh 1
delete object 1
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Merci mais:
Runtime Error 5105 - Memblock position outside range at line 52
La ligne 52:

Code : Tout sélectionner

x#=int(memblock float(1,adresse  )*1000000)/1000000.0
J'ai essayé de la mettre en commentaire mais dans ce cas c'est la suivante qui plante :?
Alors j'ai mis tous le bloc Normales en commentaire, et c'est cette ligne qui plante:

Code : Tout sélectionner

write string 1,"Data.w "+str$(memblock dword(1,adresse))+","+str$(memblock dword(1,adresse+8))+","+str$(memblock dword(1,adresse+16))
J'ai DarkBASIC PRO 1.053 (appellé patch 5.3)
(vive DBpro :mad: )

Esce que chez toi ca marche ?

Si ca marche chez toi esce que tu peut remplacer ca:

Code : Tout sélectionner

rem FichierX$="fichier.x"       : Rem nom du fichier à convertir ( préciser le chemin si nécessaire ou le copier dans le répertoire )
rem FichierMesh$="fichier.msh" : Rem nom du fichier Datas pour purebasic
par ca:

Code : Tout sélectionner

Open to read 2,"fichiers.txt"
Read String 2,FichierX$
Read String 2,FichierMesh$
Close File 2
Avec le fichier "fichiers.txt" contenant:
fichier.x
fichier.mesh
Et faire un executable ? Ca permettrait à tout le monde de s'en servir DarkBASIC ou pas et avec n'importe quelle version :D

Merci
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui ça fonctionnait chez moi , avec la version 1.13 je crois , je n'avais pas testé avec la version pro . J'ai viré entièrement darkbasic de mon disque , alors j'hésite à remettre ce logiciel encombrant juste pour compiler un source .

Oliv tu peux pas nous faire ça hein dit ??

Si personne ne le fait , je le ferai à l'occasion.

La version pro de dark gère bien les memblock ?

As-tu essayer de faire un fichier mesh à partir d'une primitive plutôt qu'un fichier .x ?

essaye à nouveau en faisant

Code : Tout sélectionner

Rem load object FichierX$,1 
make object cube 1,1 
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

La version pro de dark gère bien les memblock ?
oui
As-tu essayer de faire un fichier mesh à partir d'une primitive plutôt qu'un fichier .x ?
Je viens juste d'essayer --> marche pas non plus :?

(ouf ca viens pas de mon modele .x alors :mrgreen: )

Alala...voilà pourquoi je tiens tant à faire de la 3D avec Pure :P
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Voila , j'ai fait l'éxécutable , dis moi si ça fonctionne .

http://perso.wanadoo.fr/comtois/sources/makeMesh.zip
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Ca fonctionne ! :D

(la generation en tout cas, après j'ai pas essayé de charger le mesh dans Pure)

super utile comme logiciel merci ! :D :wink:
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Répondre