Page 1 sur 1

Creer des meshs - précisions

Publié : ven. 24/sept./2004 18:33
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:

Publié : ven. 24/sept./2004 18:54
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:

Publié : ven. 24/sept./2004 23:50
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

Publié : sam. 25/sept./2004 10:15
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

Publié : lun. 27/sept./2004 17:15
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 .

Publié : mar. 28/sept./2004 18:44
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

Publié : mar. 28/sept./2004 19:12
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

Publié : mer. 29/sept./2004 13:43
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

Publié : mer. 29/sept./2004 17:15
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 

Publié : mer. 29/sept./2004 20:24
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

Publié : jeu. 30/sept./2004 20:04
par comtois
Voila , j'ai fait l'éxécutable , dis moi si ça fonctionne .

http://perso.wanadoo.fr/comtois/sources/makeMesh.zip

Publié : ven. 01/oct./2004 20:32
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: