M3D_Matrix3D version 2 - en préparation et open source.
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é.
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.
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.

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.
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 ?

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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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.

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.
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.
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.
Tu vas loin là! 
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.

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.
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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://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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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().
[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 .
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
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
ou ajoutez un répertoire Robot avec les fichiers qui vont bien.
vous pouvez remplacer
par
pour voir le bug .
[EDIT]
J'ai un peu changé "l'éditeur de map"
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)
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.