M3D_Matrix3D version 2 - en préparation et open source.

Généralités sur la programmation 3D
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

djes,

En fait ce n'est pas qu'on ne peut pas rentrer à l'intérieur des objets, mais le problème d'intérieur / extérieur ne peut pas être traité simultanément.

D'où ma réaction première sur la proposition de Comtois.

En fait la logique qui préside à l'écriture de fonctions de traitements 3D est déjà bien lourde pour chercher à gérer les deux à la fois. Mais je disais ensuite que celà vaut peut être le coup de tenter un traitement simultané, simplement parce que de nos jours on est beaucoup moins contraints par des aspects de mémoire ou de performances CPU.

Ce que je pressens, c'est que le traitement simultané soit au bout du compte un peu plus coûteux, mais je n'arrive pas encore à le modéliser de manière pratique.

Par contre en parvenant à gérer finement et de manière performante la visibilité de l'une ou l'autres des faces d'un triangle, il est peut possible de gagner en temps de traitement.

Dans tous les cas il ne faut pas dire qu'on ne peut pas voir l'intérieur et l'extérieur d'un objet au même instant. Ce qu'on ne peut pas voir dans une géométrie régulière, c'est les deux côtés d'un triangle, d'une facette.

Dans le cas général, un objet est rarement complètement fermé ou ouvert, et on peut toujours matérialiser le fait de traverser un objet fermé.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Je ne te suis pas trop... D'ailleurs depuis le début je ne vous suis pas ;)

Dans le monde réel un objet est toujours complètement fermé. Si tu prends le cas d'une boîte, tu peux te la représenter comme deux cubes, l'un dont les faces (et leurs normales) sont dirigées vers l'extérieur, et un autre plus petit, à l'intérieur du premier, dont les faces (et leurs normales) sont dirigées vers l'intérieur. L'espace étant entre les deux est la matière, à l'intérieur de laquelle tu ne peux pas mettre ton oeil :)

Par contre, il est bien sûr possible de voir l'intérieur et l'extérieur simultanément, par exemple si la boîte est en verre. Dans ce cas encore, le calcul des rayons ne fonctionnera correctement que si les polygones ne sont pas à double face.

Après, au niveau de l'affichage, si l'on veut faire du double face, ce n'est qu'une question de calcul relativement simple.

Par contre, au niveau des UV, le problème est plus complexe et devrait prendre en compte la nature des objets. Lightwave, si je ne me trompe pas, réagit différemment suivant que l'objet reboucle (un cylindre) ou pas, afin d'éviter des erreurs de rendu au niveau de la jonction des polygones.

Au fait, si je parle de polygones, c'est que lightwave n'oblige pas à travailler seulement avec des triangles! Tout ce qu'il demande, c'est que les surfaces soient planes.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai un gros rhume et un gros mal de tête , je vous relirai plus attentivement plus tard :)

Mais pour résumer rapidement , si j'utilise la matrice comme un terrain , la plupart du temps je n'aurai besoin que d'une seule face.
Je prévois la deuxième face pour gérer des cas comme le drapeau ou des effets de vagues que l'on peut voir ici

http://purebasic.hmt-forum.com/viewtopic.php?t=3488

dans ce cas , il faut bien pouvoir afficher les deux faces en même temps.
J'ai voulu faire des économies de vertex , je devrais faire l'essai en doublant les vertices , de façon à gérer les normales pour chaque face .

c'est peut-être à ça que vous vouliez en venir ?
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
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Désolé pour ton mal de tête, je sais ce que c'est, j'en ai souvent :)

Je voulais juste apporter ma contribution pour éclaircir les choses, surtout les termes. Ainsi, dans lightwave on a:
Les points
Les polygones (composés d'un ou de plusieurs points)
Les objets (composés de polygones)
Les surfaces définissant la couleur, les textures, etc. (associées à un ou plusieurs polygones)

Dans le cas d'un drapeau, on aurait une matrice de points, des polygones triangulaires définissant une face, et soit des polygones triangulaires définissant l'autre face (et utilisant les mêmes points), soit un attribut de surface définissant ces polygones comme des doubles-faces.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Juste une précision. La théorie est très claire sur une chose.

Si les polygones sont réduits à des triangles, ils sont alors polarisés, ils ne peuvent être vus que d'un seul côté à la fois, ce qui n'est pas le cas général pour les polygones de plus de trois côtés.

Et c'est tout l'avantage de faire une modélisation 3D aec des triangles.

En fait souvent on traite des polygones à 4 côtés dans le concept et on les décompose en deux triangles, pour ramener le problème à une situation plus simple.

Ainsi on ne trouvera jamais de triangles "pliés" dont on pourrait voir, dans une transformation donnée, la face et en raison d'un "pli", le revers.

C'est la raison pour laquelle toute la logique doit traiter des triangles et pas autre chose.

L'attribut de côté de la surface pourrait alors, et cela a déjà été utilisé dans certains moteurs, un mot mémoire, un simple bit, ou le signe d'une valeur.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Tu vas loin là! :lol:

Dans Lightwave, on peut depuis toujours utiliser des polygones autres que des triangles. Le logiciel affiche le coefficient de planéarité (les points doivent tous être situés dans un plan), et si celui-ci dépasse un certain seuil, tu peux être sûr que tu vas avoir des erreurs de rendu.

Des outils existent aussi pour tranformer les polys en triangle simples. Cependant, les plus anciens utilisateurs apprécient beaucoup de pouvoir travailler avec des quadrangles ou mieux, surtout au niveau de la modélisation; par exemple un "E" vu de face serait composée de dizaines de triangles, tandis que lightwave nous permet de n'avoir qu'un polygone.

A la fin simplement, ou pour l'export dans d'autres logiciels, on triangulise ses objets.

Et comment savoir de quel côté est la normale de la surface? Par convention, l'ordre des points nous le dit. Tous les polygones dont les points sont dans le sens horaire sont tournés vers l'utilisateur. Comme vous le savez, c'est aussi le principe de l'algo le plus simple d'élimination des faces cachées.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Premier code source de la version 2.0 beta 1

il manque plein de choses, mais puisque le projet est open source, autant montrer au plus tôt l'avancement .

Il manque :
- la gestion du double face
- le scrolling des facettes
- le calcul des normales
- La gestion des couleurs
et d'autres bricoles .

Je n'ai pas encore dépoussiéré le code ,si vous voyez des horreurs , ou des simplifications n'hésitez pas à en parler.

Pendant mes tests , je n'ai pas réussi à faire fonctionner les couleurs.
Fred a testé aussi avec l'exemple du cube,il confirme que ça ne marche pas . il va regarder .
Et j'ai aussi constaté un autre gros problème , c'est que si le coin haut gauche de la matrice sort de l'écran , elle n'est plus du tout affichée !!
J'ai fait d'autres essais avec le programme shadow.pb et en fait , le problème existe aussi avec le mesh de Fred, donc , je ne pense pas que le problème vienne de ma lib, mais de la lib 3D de purebasic.
Fred n'a pas répondu sur ce point , donc pour l'instant je ne peux que supposer ...

Voila le code source 16 ko

http://perso.wanadoo.fr/comtois/M3D_Mat ... x3DV2a.zip
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Nouvelle version beta 2

J'ai ajouté
-le double face , mais en réutilisant les points existants ( les normales sont calculées pour une seule face )
-le calcul des normales ( il y a une inversion quelque part , mais je viens de le faire , je corrigerai plus tard )
-Et quelques fonctions supplémentaires

par rapport à l'ancienne lib , je crois qu'il manque la gestion des couleurs et le scrolling des facettes , sinon tout y est ?
Je n'ai pas encore vérifié .

Je vais avoir du mal à tester avec le gros bug actuel ,la matrice disparait dès que le coin du haut est hors écran :?

http://perso.wanadoo.fr/comtois/M3D_Mat ... x3DV2b.zip
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.
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

Comtois le roi de la 3d et j'adore ce qu'il fait en 3D avec PB
Bravo bravo bravo
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Nouvelle version

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

J'ai changé la méthode de calcul pour obtenir la hauteur d'un point sur la matrice.

J'ai ajouté :
- une fonction qui retourne la normale du triangle sur lequel on se trouve. ça peut servir à gérer des collisions glissantes par exemple.
- Les fonctions SaveMatrix() et LoadMatrix()

J'ai corrigé quelques bugs
- le double face
- le calcul des normales semble correct , éventuellement j'ajouterai une autre méthode de calcul plus tard pour pondérer par les angles.
- Il y avait un petit bug dans la fonction TextureFacette()

bon je crois que c'est à peu près tout .

Je vais ajouter les fonctions de scrolling des facettes et ClipTexture().

ClipTexture() donnera plus de souplesse que TextureFacette()
puisqu'il sera possible de donner soi-même les coordonnées UV.

Ensuite , je ferai quelques exemples pour illustrer l'utilisation des fonctions. Mais j'ai toujours ce souci d'affichage ,et je ne sais pas si ça vient de moi ou de la lib 3D de PureBasic .
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
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Désolé Comtois, j'ai pas vraiment eu le temps de me pencher sur la lib ce weekend, mais tu as l'air d'avoir bien bossé :)

Pour le pb d'affichage, je l'ai aussi (tester sur une radeon et une geforce : meme probleme)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Cederavic

Ben j'avais déjà fait une première version, ça va plus vite cette fois ci :)

Avant j'utilisais des peek et des poke , c'est quand même beaucoup plus simple avec les pointeurs.
J'ai aussi un peu changer l'organisation en mémoire par rapport à l'ancienne version.

j'ai repris une démo de filperj , j'ai un bug si je prends une matrice de 125x125 , apparemment la limite a changé , c'est 120x120 en double face maintenant . pourtant le nombre de triangles est identique ? il faut que je vérifie ça .

voici la démo de filperj , à part ce problème de taille , j'avais aussi un problème avec la création de la texture avec les plots, j'ai mis des box , sinon c'est le code original de filperj.

Et j'ai supprimé les UpdateVertex() et UpdateTexture()
désormais il n'y a plus que UpdateMatrix().

Code : Tout sélectionner

;- 17 juin 2004 - 
; Auteur : filperj
;PB 3.94 avec la lib 3D ogre 1.03 beta

XIncludeFile "d:\M3D_Matrix3D.30.12.04\Code\M3D_Matrix3DV2c.pb"

#pi=3.141593


#larjmap=120 : #profmap=120
#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))
      Box(0,0,1,1,$ffffff)
      Box(0,1,1,1,$ff)
      Box(1,0,1,1,$ffffff)
      Box(1,1,1,1,$ff0000)
   StopDrawing()
   CreateMaterial(0,TextureID(0))
   
   M3D_CreateMeshMatrix(0,#larjmap*#tailfacette,#profmap*#tailfacette,#larjmap,#profmap,1)
   CreateEntity(0,MeshID(0),MaterialID(0))
   M3D_PrepareMatrixTexture(0,0,1,1)
   M3D_FillMatrix(0,0)
   M3D_UpDateMatrix(0)
   AmbientColor(RGB(85,85,85))
   CreateLight(0,$ffffff,#larjmap*#tailfacette/2,800,#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




Structure noeud
   vit.f : hi.f
EndStructure


Procedure reinitmap(flip)
   
   debu=@_hmap
   fin=debu+SizeOf(hmap)-4
   For *ptr.long=debu To fin Step 4
      *ptr\l=1000;+Random(31)
   Next
   
   If flip
      Dim hmapf.noeud(#larjmap,#profmap)
   EndIf
   
EndProcedure







Procedure appmap1()
   
   For x=0 To #larjmap : For z=0 To #profmap
      hmapf(x,z)\vit+(_hmap\z[z]\x[x]-512-hmapf(x,z)\hi)*0.001
      hmapf(x,z)\hi+hmapf(x,z)\vit
      M3D_SetVertexHeight(0,x,z,hmapf(x,z)\hi/25)
   Next:Next
   
   M3D_UpDateMatrix(0)
   M3D_NormalesMatrix(0)
   
EndProcedure




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



#vitcam=4
Procedure gercam()
   
   Global 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)
     ElseIf KeyboardPushed(#PB_Key_PageUp)
      CameraLocate(0,CameraX(0),CameraY(0)+#vitcam,CameraZ(0))
     ElseIf KeyboardPushed(#PB_Key_PageDown)
      CameraLocate(0,CameraX(0),CameraY(0)-#vitcam,CameraZ(0))
     ElseIf KeyboardPushed(#PB_Key_Up)
      CameraLocate(0,vizx,CameraY(0),vizz)
     ElseIf KeyboardPushed(#PB_Key_Down)
      CameraLocate(0,2*CameraX(0)-vizx,CameraY(0),2*CameraZ(0)-vizz)
     ElseIf KeyboardPushed(#PB_Key_Left)
      CameraLocate(0,CameraX(0)-Sin(roty-#pi/2)*#vitcam,CameraY(0),CameraZ(0)-Cos(roty-#pi/2)*#vitcam)
     ElseIf KeyboardPushed(#PB_Key_Right)
      CameraLocate(0,CameraX(0)+Sin(roty-#pi/2)*#vitcam,CameraY(0),CameraZ(0)+Cos(roty-#pi/2)*#vitcam)
   EndIf
   
EndProcedure



;-DEPART

initiale()
reinitmap(1)

CreateCamera(0,0,0,100,100)
CameraLocate(0,55,100,-50)

rotx=-#pi/4



Repeat
   
   ExamineKeyboard() : ExamineMouse()
   
   If KeyboardReleased(#PB_Key_Space)
      reinitmap(fliprendus)
     Else
      martinet()
   EndIf
   
   If KeyboardReleased(#PB_Key_LeftControl)
      fliprendus=1-fliprendus
   EndIf
   
   If fliprendus
      appmap1()
     Else
      appmap0()
   EndIf
   
   gercam()
   
   ClearScreen(0,0,0)
   RenderWorld()
   FlipBuffers()
   
Until KeyboardReleased(#PB_Key_Escape) Or IsScreenActive()=0
[EDIT] j'ai l'impression que j'ai un bug dans la définition des faces , si je vais me promener sous de la matrice de filperj , je ne vois qu'une partie de la matrice ? aurais-je fait des inversions ? je vais jeter un oeil .
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Ce n'était pas qu'une impression , il y avait bien une erreur dans la définition des faces ( la deuxième face)

J'ai corrigé la procédure MakeMatrice()

Extrait

Code : Tout sélectionner


  *PtrF.Face  =*Matrice\IBuffer
  For b=0 To *Matrice\NbFacetteZ-1
    For a=0 To *Matrice\NbFacetteX-1
      P1=(a+(*Matrice\NbFacetteX*b))*4
      P2=P1+1
      P3=P2+1
      P4=P3+1
      ;Face 1 
      *PtrF\f1=P4 : *PtrF\f2=P2 : *PtrF\f3=P1
      *PtrF\f4=P2 : *PtrF\f5=P4 : *PtrF\f6=P3
      *PtrF + SizeOf(Face)
    Next
  Next

  If *Matrice\DoubleFace
	  For b=0 To *Matrice\NbFacetteZ-1
	    For a=0 To *Matrice\NbFacetteX-1
      		P1=(a+(*Matrice\NbFacetteX*b))*4
      		P2=P1+1
      		P3=P2+1
      		P4=P3+1
      
	      ;Face 2
	      *PtrF\f1=P1 : *PtrF\f2=P2 : *PtrF\f3=P4
	      *PtrF\f4=P3 : *PtrF\f5=P4 : *PtrF\f6=P2
	      *PtrF + SizeOf(Face)
	    Next
	  Next
  EndIf
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai ajouté les Shiftup , down , left et right

Et cette fois ci j'ai compilé avec Tailbite .

tout se trouve ici

http://perso.wanadoo.fr/comtois/M3D_Mat ... 2betad.zip

J'ai joint la démo de filperj , ainsi que deux exemples
-le premier permet de tester le scrolling de la matrice

-le second permet de tester la rotation d'une texture , le changement de hauteur d'une facette , et un exemple d'utilisation de GetNormale()
ça pourrait être le début d'un éditeur de map 3D :)
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai voulu tester les ombres avec la lib , et curieusement ça fonctionne en mode plein écran , alors que je n'arrive pas à faire fonctionner l'exemple de Fred ? Je ne vois pas ce qu'il y a de différent entre les deux codes ?

Par contre je n'utilise pas le même paramètre que lui sinon la scène est rouge , encore un truc étrange :?

Pour tester ,changez le chemin

Code : Tout sélectionner

Add3DArchive("Robot\", #PB_3DArchive_FileSystem)
ou ajoutez un répertoire Robot avec les fichiers qui vont bien.

vous pouvez remplacer

Code : Tout sélectionner

#PB_Shadow_Modulative

par

Code : Tout sélectionner

#PB_Shadow_Additive 

pour voir le bug .

Code : Tout sélectionner

; Exemple No7b

; => M3D_RotateTexture()
; => M3D_SetFacetteHeight()
; => M3D_GetNormale()

; Comtois le 14/10/05
; Pb 3.94 avec la lib ogre 1.03 beta


;-Constantes
;/ Ecran
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 32

;/Matrix
#Matrix1 = 0
#Sphere1 = 1
#Sphere2 = 2
#Sphere3 = 3
#Robot   = 4

;- Structures
Structure Camera
  Angle.f
  Distance.l
  Hauteur.l
  Mode.l
EndStructure

Structure Vecteur
	x.f
	y.f
	z.f
EndStructure

Global camera.Camera  ,Vp.Vecteur, Curseur.Vecteur,Hauteur.f,HeightMode.l
HeightMode=1 ; Facette=1 , Vertex=0
Hauteur=80.0

;{- Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "M3D_Matrix3DV2" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf
;}

Add3DArchive("\", #PB_3DArchive_FileSystem)
Add3DArchive("Robot\", #PB_3DArchive_FileSystem)

#PB_Shadow_None = 0
#PB_Shadow_Modulative = 1 ; Black shadow (fast)
#PB_Shadow_Additive = 2   ; Additive translucent shadow (more expensive with severl lights)
WorldShadows(#PB_Shadow_Modulative) ; Set the shadow mode for the world

LoadMesh   (#Robot, "Robot.mesh")
LoadTexture(#Robot, "r2skin.jpg")

CreateEntity (#Robot, MeshID(#Robot), CreateMaterial(#Robot, TextureID(#Robot)))
EntityLocate(#Robot,150,80,150)
AnimateEntity(#Robot, "Walk")

;- Texture
LoadTexture(#Matrix1,"T16_64x64.png")
CreateTexture(#Sphere1,64,64)
StartDrawing(TextureOutput(#Sphere1))
Box(0,0,64,64,RGB(255,0,0))
StopDrawing()

;- Matière
CreateMaterial(#Matrix1, TextureID(#Matrix1))
CreateMaterial(#Sphere1, TextureID(#Sphere1))

;- Mesh 
;Curseur
M3D_CreateMesh(#Sphere1,#M3D_Sphere)

;Matrix
M3D_CreateMeshMatrix(#Matrix1,300,300,7,7,1)
M3D_PrepareMatrixTexture(#Matrix1, #Matrix1, 4, 4)
For b = 0 To M3D_NbFacetteZ(#Matrix1)-1
  For a = 0 To M3D_NbFacetteX(#Matrix1)-1
    Read Texture
    M3D_TextureFacette(#Matrix1, a, b, Texture)
  Next a
Next b
M3D_SetFacetteHeight(#Matrix1, 3, 3, Hauteur)
M3D_NormalesMatrix(#Matrix1)
M3D_UpDateMatrix(#Matrix1)

;-Entity
; Matrix
CreateEntity(#Matrix1, MeshID(#Matrix1), MaterialID(#Matrix1))
EntityLocate(#Matrix1, 0, 0, 0)
EntityRenderMode(#Matrix1, 0)

; Curseur
For i=1 To 3
	CreateEntity(i,MeshID(#Sphere1),MaterialID(#Sphere1))
	ScaleEntity(i,i*10,i*10,i*10)
	EntityRenderMode(i, 0) 
Next i

 
;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0, M3D_MatrixWidth(#Matrix1) / 2 , EntityY(#Matrix1) + 400, 450)
CameraLookAt(0, M3D_MatrixWidth(#Matrix1) / 2, EntityY(#Matrix1), M3D_MatrixWidth(#Matrix1) / 2)

;- Light
AmbientColor(RGB(45,45,45)) 
CreateLight(0,RGB(255,255,255))

Repeat 
 
	ClearScreen(0,0,0)
	
  	If ExamineKeyboard()
    	If KeyboardReleased(#PB_Key_F2) 
			HeightMode=1-HeightMode
			If HeightMode
				If Curseur\x>=M3D_NbFacetteX(#Matrix1)
					Curseur\x=M3D_NbFacetteX(#Matrix1)-1
				EndIf
				If Curseur\z>=M3D_NbFacetteZ(#Matrix1)
					Curseur\z=M3D_NbFacetteZ(#Matrix1)-1
				EndIf
			EndIf	
		EndIf
		If KeyboardPushed(#PB_Key_LeftAlt) Or KeyboardPushed(#PB_Key_RightAlt)	 
		  	If HeightMode
	  			x.f=(Curseur\x + 0.5 * HeightMode) * M3D_FacetteWidth(#Matrix1)
				z.f=(Curseur\z + 0.5 * HeightMode) * M3D_FacetteHeight(#Matrix1) 
				y.f=M3D_GetGroundHeight(#Matrix1,x,z) 
  			Else
		  		y.f=M3D_GetVertexHeight(#Matrix1,Curseur\x,Curseur\z) 
  			EndIf
	
    		
	    	If KeyboardReleased(#PB_Key_Left) And Curseur\x>0
				Curseur\x - 1
	    	ElseIf KeyboardReleased(#PB_Key_Right) And Curseur\x<M3D_NbFacetteX(#Matrix1)-HeightMode
				Curseur\x + 1
	    	ElseIf KeyboardReleased(#PB_Key_Down) And Curseur\z<M3D_NbFacetteZ(#Matrix1)-HeightMode
				Curseur\z + 1
	    	ElseIf KeyboardReleased(#PB_Key_Up) And Curseur\z>0
				Curseur\z - 1
			EndIf	

    		If HeightMode
		    
      			M3D_SetFacetteHeight(#Matrix1,Curseur\x,Curseur\z,y)
			Else
				M3D_SetVertexHeight(#Matrix1,Curseur\x,Curseur\z,y)
			EndIf	      

			
			M3D_UpDateMatrix(#Matrix1) 
		    M3D_NormalesMatrix(#Matrix1)  
		EndIf
					 
    	If KeyboardReleased(#PB_Key_Left) And Curseur\x>0
			Curseur\x - 1
    	ElseIf KeyboardReleased(#PB_Key_Right) And Curseur\x<M3D_NbFacetteX(#Matrix1)-HeightMode
			Curseur\x + 1
    	ElseIf KeyboardReleased(#PB_Key_Down) And Curseur\z<M3D_NbFacetteZ(#Matrix1)-HeightMode
			Curseur\z + 1
    	ElseIf KeyboardReleased(#PB_Key_Up) And Curseur\z>0
			Curseur\z - 1
    	ElseIf KeyboardReleased(#PB_Key_LeftControl) And HeightMode
      		M3D_RotateTexture(#Matrix1,Curseur\x,Curseur\z,#M3D_LeftRotate)
      		M3D_UpDateMatrix(#Matrix1) 
    	ElseIf KeyboardReleased(#PB_Key_RightControl) And HeightMode
      		M3D_RotateTexture(#Matrix1,Curseur\x,Curseur\z,#M3D_RightRotate)
      		M3D_UpDateMatrix(#Matrix1)   
		EndIf
		x.f=(Curseur\x + 0.5 * HeightMode) * M3D_FacetteWidth(#Matrix1)
		z.f=(Curseur\z + 0.5 * HeightMode) * M3D_FacetteHeight(#Matrix1)  
  		If HeightMode
			y.f=M3D_GetGroundHeight(#Matrix1,x,z) 
			M3D_GetNormale(#Matrix1, x, z,@Vp)
  		Else
		  	y.f=M3D_GetVertexHeight(#Matrix1,Curseur\x,Curseur\z) 
	  		Vp\x=0
		  	Vp\y=1
	  		Vp\z=0
  		EndIf
	   
    	If KeyboardPushed(#PB_Key_LeftShift) 
		    Hauteur = y + 2
    		If HeightMode
      			M3D_SetFacetteHeight(#Matrix1,Curseur\x,Curseur\z,Hauteur)
			Else
				M3D_SetVertexHeight(#Matrix1,Curseur\x,Curseur\z,Hauteur)
			EndIf	      
      		M3D_UpDateMatrix(#Matrix1) 
		    M3D_NormalesMatrix(#Matrix1)  
    	ElseIf KeyboardPushed(#PB_Key_RightShift) 
    		Hauteur = y - 2
		    If HeightMode
      			M3D_SetFacetteHeight(#Matrix1,Curseur\x,Curseur\z,Hauteur)
			Else
				M3D_SetVertexHeight(#Matrix1,Curseur\x,Curseur\z,Hauteur)
			EndIf
      		M3D_UpDateMatrix(#Matrix1)  
		    M3D_NormalesMatrix(#Matrix1)       
    	EndIf 
	    
    	If KeyboardReleased(#PB_Key_F1)
      		Camera\Mode = #PB_Camera_Wireframe - Camera\Mode
      		CameraRenderMode(0,Camera\Mode)
    	EndIf 
  	EndIf
	  
	For i=#Sphere1 To #Sphere3		  
	   	EntityLocate(i,x + Vp\x * i*i*5, y + Vp\y * i*i*5, z + Vp\z * i*i*5)
	Next i 

    LightLocate(0,EntityX(3) , EntityY(3) + 35, EntityZ(3))
    EntityLocate(#Robot,150,M3D_GetGroundHeight(#Matrix1,150,150),150)
    RotateEntity(#Robot,0.3,0,0)
    RenderWorld()
  
  	;Aide
   	StartDrawing(ScreenOutput())
   		FrontColor(255,255,255)
   		DrawingMode(1)
   		Locate(10,0)
   		DrawText("Use Arrow key = Move cursor ")
   		Locate(10,20)
   		DrawText("Use LeftControl And RightControl = Rotate Texture ")		
   		Locate(10,40)
   		DrawText("Use LeftShift And RightShift = Height Facette/Vertex ")	
		Locate(10,60)
   		DrawText("Use LeftAlt And RightAlt And Arrow key = Height Facette/Vertex ")	
		Locate(10,80)
   		DrawText("[F1] Camera")
		Locate(10,100)
   		DrawText("[F2] Mode Facette/Vertex")			
   	StopDrawing()
  	FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape) 

End
 

DataSection
Data.l 5,5,5,5,5,5,5
Data.l 5,1,1,1,1,1,5
Data.l 5,1,6,6,6,1,5
Data.l 5,1,6,14,6,1,5
Data.l 5,1,6,6,6,1,5
Data.l 5,1,1,1,1,1,5
Data.l 5,5,5,5,5,5,5
EndDataSection
[EDIT]
J'ai un peu changé "l'éditeur de map"
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.
Répondre