Librairie M3D_Matrix3D

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

Librairie M3D_Matrix3D

Message par comtois »

Je viens de faire une petite librairie pour gérer des matrices en 3D.
ça se trouve ici (251 ko):

http://perso.wanadoo.fr/comtois/M3D_Mat ... trix3D.zip

Dans le répertoire librairie il y a deux fichiers
M3D_Matrix3D => C'est la librairie à copier dans le répertoire PureLibrairies/UserLibrairies
Index.htm => C'est la liste des commandes disponibles.

Dans le répertoire Exemples il y a 6 fichiers d'exemple d'utilisation , j'en ferai d'autres.
J'ai d'autres commandes à ajouter avant :)

A ce stade ,votre avis m'intéresse , sur le nom des fonctions ,sur l'intérêt de la chose. Les bugs constatés etc.
Toutes les remarques seront les bienvenues :)

Et si quelqu'un voulait s'hasarder à faire une petite démo avec cette lib , je la joindrai au prochain zip.De mon côté , je vais essayer d'en faire d'autres .
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Et déjà ton 1er nioubi râleur:
OUIIIIIIN, pourquoi ça marche paaaaaaaaas :cry: :cry: :cry:

Code : Tout sélectionner



#larjmap=400 : #profmap=400
#tailfacette=100

Structure hmap
   v.l[(#larjmap+1)*(#profmap+1)]
EndStructure

Global _hmap.hmap


Procedure initiale()
   
   If InitEngine3D()=0
      MessageRequester("AU SECOURS JE ME NGLOUGLouglou","échoué à initialiser la 3D - Vérifiez la présence de "+Chr('"')+"Engine3D.dll"+Chr('"'))
      End
   EndIf
   
   If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0 Or OpenScreen(800,600,32,"Martin & Matrice")=0
      MessageRequester("Aaaaargh!","échec de l'initialisation de DirectX7")
      End
   EndIf
   
   CreateTexture(0,1,1)
   StartDrawing(TextureOutput(0))
      Plot(0,0,$ffffff)
   StopDrawing()
   CreateMaterial(0,TextureID(0))
   
   M3D_CreateMeshMatrix(0,#larjmap*#tailfacette,#profmap*#tailfacette,#larjmap,#profmap,1)
   CreateEntity(0,MeshID(0),MaterialID(0))
   EntityLocate(0,-#larjmap*#tailfacette/2,0,-#profmap*#tailfacette/2)
   
   M3D_PrepareMatrixTexture(0,0,1,1)
   M3D_UpDateVertex(0)
   M3D_UpDateTexture(0)
   
   
   CreateLight(0,$ffffff,-#larjmap*#tailfacette/2,400,-#profmap*#tailfacette/2)
   
EndProcedure


Procedure martinet()
   
   For x=1 To #larjmap-1 : For z=1 To #profmap-1
      pointe=x+z*(#larjmap+1)
      _hmap\v[pointe]=((_hmap\v[pointe-(#larjmap+1)]+_hmap\v[pointe+(#larjmap+1)]+_hmap\v[pointe-1]+_hmap\v[pointe+1])/4+1)&$3ff
   Next:Next
   
EndProcedure



Procedure reinitmap()
   
   For t=0 To (#larjmap+1)*(#profmap+1)-1
      _hmap\v[t]=0
   Next
   
EndProcedure



Procedure appmap()
   
   For x=0 To #larjmap : For z=0 To #profmap
      M3D_SetVertexHeight(0,x,z,_hmap\v[x+z*(#larjmap+1)])
   Next:Next
   
   M3D_UpDateVertex(0)
   M3D_NormalesMatrix(0)
   
EndProcedure



#vitcam=5
Procedure gercam()
   
   RotateCamera(0,MouseDeltaY(),MouseDeltaY(),0)
   If MouseButton(0)
      avant=#vitcam
     ElseIf MouseButton(1)
      avant=-#vitcam
   EndIf
   If KeyboardPushed(#pb_key_up)
      haut=#vitcam
     ElseIf KeyboardPushed(#pb_key_down)
      haut=-#vitcam
   EndIf
   If KeyboardPushed(#pb_key_left)
      gauche=#vitcam
     ElseIf KeyboardPushed(#pb_key_right)
      gauche=-#vitcam
   EndIf
   MoveCamera(0,avant,haut,gauche)
   
EndProcedure



;-DEPART

initiale()

CreateCamera(0,0,0,100,100)
CameraLocate(0,0,200,0)


Repeat
   
   ExamineKeyboard() : ExamineMouse()
   
   If KeyboardReleased(#pb_key_space)
      reinitmap()
     Else
      martinet()
   EndIf
   
   appmap()
   
   gercam()
   
   RenderWorld()
   FlipBuffers()
   
Until KeyboardReleased(#pb_key_escape) Or IsScreenActive()=0

N'empêche que c'est une excellente idée :wink:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je vais jeter un oeil sur ton code ,sinon les exemples fonctionnent chez toi ? les six ?

Code : Tout sélectionner

Debug M3D_CreateMeshMatrix(0,#larjmap*#tailfacette,#profmap*#tailfacette,#larjmap,#profmap,1) 
Renvoie -1 , ça signifie qu'il y a une erreur de paramètre , va falloir que je fasse une petite doc :) => Tu peux tester toutes les fonctions comme ça , ça te donne déjà une indication .

les paramètres sont :
ProcedureDLL.l M3D_CreateMeshMatrix(No.l, Largeur.f, Profondeur.f, NbFacetteX.l, NbFacetteZ.l, DoubleFace.l)
Largeur => Largeur totale de la matrice ( X )
Profondeur => hauteur ou profondeur totale de la matrice ( Z )
NbFacetteX => Nombre de Facette en X
NbFacetteZ => Nombre de Facette en Z

Et tu as la taille d'une facette en X = Largeur / NbFacetteX
et en Z = Profondeur / NbFacetteZ

Et je m'aperçois que je n'ai pas fait de procédure pour retourner ces deux valeurs , je vais le faire tout de suite :)

Autre détail le Nombre de Facettes ne peut pas dépasser 125 en X , et 125 en Z .
et toi tu mettais 400 .

Donc en changeant ça , je vois un truc qui bouge, mais c'est gris , je vais regarder le reste du code .
Dernière modification par comtois le mer. 16/juin/2004 19:27, modifié 1 fois.
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Oui, les 6 exemples fonctionnent au poil.
Moi, le débogueur me sort que le mesh est pas initialisé, mais je vois vraiment pas où ça cloche :roll:
(probablement un truc idiot)
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oups , j'ai répondu au dessus :)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

J'ai ramené les dimensions à 125 et effectivement ça marche.
Bon, avant d'aller plus loin je vais faire un copier-coller de tes fonctions de caméra, pasque là...
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok , dès que ça marche tu nous montres ça :)

si tu as d'autres questions ,n"hésite pas .

Je vais ajouter quelques fonctions ... et peut-être commencer un peu la doc ? :?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

EXELENT travail comtois! :D
je regarde tout ça de plu pres :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok , j'attends des critiques sévères :)

Je suis en train de me demander comment raccourcir le nom des fonctions , s'il y a des suggestions , je suis preneur :)

Je pense déjà enlever Matrix qui apparait un peu partout , je l'avais mis avant de mettre un préfixe , maintenant je pense qu'avec le M3D ça devrait suffire pour ne pas confondre avec autre chose.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

bon y a un bug, soit c'est ogre soit c'est quand tu creer la matrice (enfin les faces), par moment on vois des faces qui ne sont normalement pas visible et qu ne devrait pas exister, c'est le cas quand on se met dos a un coin d'un endroit elever... pa facil a expliquer lolje ferai une capture qd serveurperso aura la 1024 :)

sinon pour les commandes, tu peut dejas commencer par enveler tout les M3D :P
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Oui je vois ce que tu veux dire , il m'embête ce bug ,et comme j'ai vu Danilo signaler un bug sur les normales ,j'attends de voir avec la nouvelle version ce que ça donnera :)

Et si après la mise à jour ,j'ai toujours le problème , je regarderai encore une fois , mais là je ne vois pas :?

En attendant je vais encore ajouter quelques trucs .

Sinon pour le M3D , j'ai lu plusieurs fois qu'il était conseillé de mettre un préfixe , déjà ça permet d'identifier plus vite à quelle librairie appartient la fonction , et ensuite , ça évite de foutre le bazar si un jour Fred décide d'utiliser le nom d'une des fonctions d'une librairie .


[Edit] tu as bien fait de me parler de ce bug , ça m'a donné une idée , enfin un truc que j'ai oublié de faire , je vais ajouter une commande pour supprimer ou ajouter le doubleFace même après création de la matrice, ça doit être possible .
ensuite je vais essayer l'exemple No5 en supprimant l'autre face pour voir si le problème persiste ,ça va déjà réduire de moitié le nombre de triangles , et donc les erreurs possibles , ça facilitera la recherche :)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Ah, mon bidule commence à ressembler à quelquechose 8)
Alors la caméra se controle avec la souris (bouton gauche pour avancer, droit pour reculer).
Ca met un moment à s'animer, faut être patient.
La barre espace réinitialise la séquence.

Code : Tout sélectionner

#pi=3.141593


#larjmap=125 : #profmap=125
#tailfacette=1

Structure lignmap
   x.l[#larjmap+1]
EndStructure
Structure hmap
   z.lignmap[#profmap+1]
EndStructure

Global _hmap.hmap


Procedure initiale()
   
   If InitEngine3D()=0
      MessageRequester("AU SECOURS JE ME NGLOUGLouglou","échoué à initialiser la 3D - Vérifiez la présence de "+Chr('"')+"Engine3D.dll"+Chr('"'))
      End
   EndIf
   
   If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0 Or OpenScreen(800,600,32,"Martin & Matrice")=0
      MessageRequester("Aaaaargh!","échec de l'initialisation de DirectX7")
      End
   EndIf
   
   CreateTexture(0,2,2)
   StartDrawing(TextureOutput(0))
      Plot(0,0,$ffffff)
      Plot(0,1,$ff)
      Plot(1,0,$ff00)
      Plot(1,1,$ff0000)
   StopDrawing()
   CreateMaterial(0,TextureID(0))
   
   M3D_CreateMeshMatrix(0,#larjmap*#tailfacette,#profmap*#tailfacette,#larjmap,#profmap,1)
   CreateEntity(0,MeshID(0),MaterialID(0))
   EntityLocate(0,-#larjmap*#tailfacette/2,0,#profmap*#tailfacette)
   
   M3D_PrepareMatrixTexture(0,0,1,1)
   M3D_UpDateVertex(0)
   M3D_FillMatrix(0,0)
   M3D_UpDateTexture(0)
   
   
   CreateLight(0,$ffffff,-#larjmap*#tailfacette/2,400,-#profmap*#tailfacette/2)
   
EndProcedure


Procedure martinet()
   
   _hmap\z[0]\x[0]=((_hmap\z[#profmap]\x[0]+_hmap\z[1]\x[0]+_hmap\z[#profmap]\x[#larjmap]+_hmap\z[0]\x[1])/4+1)&$3ff
   For x=1 To #larjmap-1
      _hmap\z[0]\x[x]=((_hmap\z[#profmap]\x[x]+_hmap\z[1]\x[x]+_hmap\z[0]\x[x-1]+_hmap\z[0]\x[x+1])/4+1)&$3ff
   Next
   _hmap\z[0]\x[#larjmap]=((_hmap\z[#profmap]\x[#larjmap]+_hmap\z[1]\x[#larjmap]+_hmap\z[0]\x[#larjmap-1]+_hmap\z[1]\x[0])/4+1)&$3ff
   
   For z=1 To #profmap-1
      _hmap\z[z]\x[0]=((_hmap\z[z-1]\x[0]+_hmap\z[z+1]\x[0]+_hmap\z[z-1]\x[#larjmap]+_hmap\z[z]\x[1])/4+1)&$3ff
      For x=1 To #larjmap-1
         _hmap\z[z]\x[x]=((_hmap\z[z-1]\x[x]+_hmap\z[z+1]\x[x]+_hmap\z[z]\x[x-1]+_hmap\z[z]\x[x+1])/4+1)&$3ff
      Next
      _hmap\z[z]\x[#larjmap]=((_hmap\z[z-1]\x[#larjmap]+_hmap\z[z+1]\x[#larjmap]+_hmap\z[z]\x[#larjmap-1]+_hmap\z[z+1]\x[0])/4+1)&$3ff
   Next
   
   _hmap\z[#profmap]\x[0]=((_hmap\z[#profmap-1]\x[0]+_hmap\z[0]\x[0]+_hmap\z[#profmap-1]\x[#larjmap]+_hmap\z[#profmap]\x[1])/4+1)&$3ff
   For x=1 To #larjmap-1
      _hmap\z[#profmap]\x[x]=((_hmap\z[#profmap-1]\x[x]+_hmap\z[0]\x[x]+_hmap\z[#profmap]\x[x-1]+_hmap\z[#profmap]\x[x+1])/4+1)&$3ff
   Next
   _hmap\z[#profmap]\x[#larjmap]=((_hmap\z[#profmap-1]\x[#larjmap]+_hmap\z[0]\x[#larjmap]+_hmap\z[#profmap]\x[#larjmap-1]+_hmap\z[0]\x[0])/4+1)&$3ff
   
EndProcedure



Procedure reinitmap()
   
   debu=@_hmap
   fin=debu+SizeOf(hmap)-4
   For *ptr.long=debu To fin Step 4
      *ptr\l=0
   Next
   
EndProcedure



Procedure appmap()
   
   For x=0 To #larjmap : For z=0 To #profmap
      M3D_SetVertexHeight(0,x,z,_hmap\z[z]\x[x]/25)
   Next:Next
   
   M3D_UpDateVertex(0)
   M3D_NormalesMatrix(0)
   
EndProcedure



#vitcam=4
Procedure gercam()
   
   Static rotx.f,roty.f
   
   rotx-MouseDeltaY()/400
   If rotx>#pi/2
      rotx=#pi/2
     ElseIf rotx<-#pi/2
      rotx=-#pi/2
   EndIf
   
   roty-MouseDeltaX()/400
   
   DefType.f vizx,vizy,vizz
   
   vizx=CameraX(0)+Sin(roty)*#vitcam
   vizz=CameraZ(0)+Cos(roty)*#vitcam
   vizy=CameraY(0)+Sin(rotx)*#vitcam
   
   CameraLookAt(0,vizx,vizy,vizz)
   
   If MouseButton(1)
      CameraLocate(0,vizx,vizy,vizz)
     ElseIf MouseButton(2)
      CameraLocate(0,2*CameraX(0)-vizx,2*CameraY(0)-vizy,2*CameraZ(0)-vizz)
   EndIf
   
EndProcedure



;-DEPART

initiale()

CreateCamera(0,0,0,100,100)
CameraLocate(0,0,20,0)
;CameraLookAt(0,100,200,100)


Repeat
   
   ExamineKeyboard() : ExamineMouse()
   
   If KeyboardReleased(#pb_key_space)
      reinitmap()
     Else
      martinet()
   EndIf
   
   appmap()
   
   gercam()
   
   ClearScreen(0,0,0)
   RenderWorld()
   FlipBuffers()
   
Until KeyboardReleased(#pb_key_escape) Or IsScreenActive()=0

Au fait, pourquoi cette limite de 125 ?
les utilisateurs en veulent toujours plus! :twisted:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Wow , c'est Super , ça fait un effet de goutte d'eau dans une flaque , j'aime bien :)

Je vais le mettre avec les autres exemples si tu es d'accord ?

Pour la limitation , c'est vrai j'exagère ,Je pourrais limiter à 127 , je vais le faire :)

Pourquoi cette limite ? Parce qu'on est limité à un mot de 16 bits .( Fred avait expliqué cette limite sur le musée , mais je ne peux pas y aller pour te recopier son explication , en gros c'est une limite DirectX si j'ai bien compris ? ) peu importe, j'ai retenu qu'on était limité à un mot .
Une facette prend entre 2 et 4 triangles selon qu'on l'on est en simple ou double face.
soit 65000 / 4 = 16250 facettes possibles

SQR(16250) = 127

Donc limite de 127x127 ( pour une matrice carrée ).
Mais c'est vrai que je pourrais ne pas limiter à 125 , et laisser le choix , après tout avec une matrice de 50 x 325 on ne dépasse pas la limite des 65000 , il faudrait que je fasse des essais pour vérifier si ça fonctionne ,dans ce cas ,je testerai seulement la limite de 65000 , mais tu ne pourras de toute façon pas avoir une matrice de 400 x 400 facettes .


Et puis je crois que sur DarkBasic c'était limité à 70x70 ? enfin je ne sais plus très bien , si quelqu'un peut confirmer ?
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Sur DB je croie que c'était 5 000 facettes...
Oui c'est vrai que ce srai plus souple de limiter au total de facettes.
Sinon pas de problème si tu veux coller mon petit code dans les exemples. J'essaierai peut-être de peaufiner un peu demain.

Bon, bonne nuit!
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je viens de faire

Code : Tout sélectionner

make matrix 1 ,10000,10000,50,50
position camera 1000,100,100
rotate camera 0,40,0
wait key
sur mon dark pro et ça passe nikel !!

10000 par 10000 avec des tile de 50 par 50 ... :)
Répondre