Labyrinthe 3D - début d'un nouveau projet

Généralités sur la programmation 3D
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Ar-S »

THE commande pour du Hack n Slash :D
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

C'est quoi ça "Hack n Slash" ?

Bon avant que mon programme ne soit dépassé par la 4.6, je poste le projet d'éditeur de monde 3D sur lequel je bosse.
Il manque encore beaucoup de choses...
- Il n'y a qu'un seul type de mesh
- je dois ajouter un magnétisme pour que les meshs se collent parfaitement les uns aux autres
- ...and more

Le principe de mon éditeur :
1 - on construit les décors avec des mesh qui ne sont pas texturés
Ces mesh ont cependant un volume qui servira pour les collisions

2 - on pourra mapper toutes ou certaines faces des mesh

3- je vais recréer des meshs (avec textures) à partir des faces texturées

Mais avant de commencer les points 2 & 3, j'attends un peu la version 4.6...
En attendant, je travaille sur l'ergonomie et l'interface de mon éditeur qui avouons-le, sont pas terrible :mrgreen:

Déplacement avec les touches gauche-droite et la souris
Quand on pointe sur un mesh, celui-ci devient rouge :oops:
En cliquant sur le bouton gauche et en restant appuyé dessus on entre en mode déplacement du mesh.
Là, tout en gardant le doigts sur le bouton gauche (le mesh reste rouge) on clique de F2 à F7 et vous pouvez déplacer ou faire tourner le mesh avec les touches du clavier (haut-bas pour aller vite) (gauche-droite pour de la précision).
Il est clair que le magnétisme est indispensable pour que les jonctions soient clean.

F1 = affiche les boites englobantes
F2 = modifie pos x du mesh
F3 = modifie pos y du mesh
F4 = modifie pos z du mesh
F5 = modifie angle x du mesh
F6 = modifie angle y du mesh
F7 = modifie angle z du mesh
F8 = ajoute un nouveau mesh
F9 = supprime le mesh sélectionné
F10 = mets à 0,00 les valeurs en cours de modification (F2 à F7)
ESC = Quitte le programme

NB = le programme enregistre automatiquement le map avant de quitter.

Si vous avez des suggestions pour améliorer l'ergonomie, je prends !!!
Merci d'avance

http://xdji.free.fr/Telechargement/Mad%20Fire%20II.zip
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

Hello,

Retour de vacances, j'ai lamentablement égaré ma clé USB :? avec la plupart de mes dernières sources...
Heureusement, j'ai retrouvé 2, 3 codes sur le forum :D

A fond la 3D avec la 4.60 beta 4 et la StaticGeometry pour un modeste CreateWorld
Only PureBasic makes it possible
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Ar-S »

j'ai lamentablement égaré ma clé USB :? avec la plupart de mes dernières sources...
La misère ^^
ça te motive à tâter de la 4.60 comme ça ;)
courage ! Nul doute que tu vas nous pondre de "impressionnant"
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

C'est la version 4.6 qui est impressionnante :D

Je suis dans les codes de G-Rom pour essayer de comprendre et pas mal sur le forum anglais : trop nul pour parler mais pas trop non plus pour comprendre !!

J'avance doucement sur une structure commune pour le Map Editor, les collisions et l'affichage d'un monde en 3D.
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

Hop,

Petite mais heureuse avancée en 3D avec la 4.60 beta 4
grâce aux codes de G-Rom et Comtois repris sur les forums français et anglais

C'est pas joli, j'en conviens mais suis content de mes colonnes...

Deux images à télécharger :

http://xdji.free.fr/Telechargement/Colonne.jpg

http://xdji.free.fr/Telechargement/Sol00.jpg

Avec le code ci-dessous

Code : Tout sélectionner

; Xdji, Aout 2011
; Pb 4.6 beta 4

; Special Greatings to Comtois & G-Rom for their Work

#CameraSpeed =0.05
#Hauteur = 1

#PB_Engine_Relative_Rotation=16
#PB_Engine_Euler_Rotation=64

Define.f x, y, z, u, v
Define.l Co
Define.w t1, t2, t3

InitEngine3D()
InitSprite()
InitSprite3D()

InitKeyboard()
InitMouse()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "char")


;- Génération de la police de caractère
LoadImage(0,"Data/police.bmp")
For j =0 To 46:GrabImage(0,1,j*6,0,6,7)
CreateSprite(j,6,7,#PB_Sprite_Texture):TransparentSpriteColor(j, 0)
StartDrawing(SpriteOutput(j)):DrawImage(ImageID(1),0,0): StopDrawing()
CreateSprite3D(j, j):Next


AntialiasingMode(#PB_AntialiasingMode_x6)
;WorldDebug(#PB_World_DebugEntity)

 Add3DArchive("/Data/", #PB_3DArchive_FileSystem)
    Add3DArchive("/", #PB_3DArchive_FileSystem)
    

;---- Matière
 LoadTexture(0,"Sol00.jpg")
    LoadTexture(1,"Colonne.jpg")
CreateMaterial(0, TextureID(0))
CreateMaterial(1, TextureID(1))


;---- Mesh

CreateMesh(0)

Restore Sommet_carre
For i=0 To 3
  Read.f x : Read.f y : Read.f z
  Read.l Co
  Read.f u : Read.f v
  AddMeshVertex(x, y, z)
  MeshVertexColor(Co)
  MeshVertexTextureCoordinate(u, v)
Next i

For i=0 To 1
  Read.w t1 : Read.w t2 : Read.w t3
  AddMeshFace(t1, t2, t3)
Next i
FinishMesh()


;-- Creation d'une face rectangulaire
CreateMesh(1)

Restore Sommet_rectangle
For i=0 To 3
  Read.f x : Read.f y : Read.f z
  Read.l Co
  Read.f u : Read.f v
  AddMeshVertex(x, y, z)
  MeshVertexColor(Co)
  MeshVertexTextureCoordinate(u, v)
Next i

For i=0 To 1
  Read.w t1 : Read.w t2 : Read.w t3
  AddMeshFace(t1, t2, t3)
Next i
FinishMesh()



;-- Creation d'une facette de colonne
CreateMesh(2)

Restore Sommet_colonne
For i=0 To 3
  Read.f x : Read.f y : Read.f z
  Read.l Co
  Read.f u : Read.f v
  AddMeshVertex(x, y, z)
  MeshVertexColor(Co)
  MeshVertexTextureCoordinate(u, v)
Next i

For i=0 To 1
  Read.w t1 : Read.w t2 : Read.w t3
  AddMeshFace(t1, t2, t3)
Next i
FinishMesh()


;---- Entity

;-- creation de 6 entity pour chacune des 6 faces d'un cube
CreateEntity(0,MeshID(0), MaterialID(0))  ; devant
CreateEntity(1,MeshID(0), MaterialID(0))  ; bas
CreateEntity(2,MeshID(0), MaterialID(0))  ; droite
CreateEntity(3,MeshID(0), MaterialID(0))  ; haut
CreateEntity(4,MeshID(0), MaterialID(0))  ; gauche
CreateEntity(5,MeshID(0), MaterialID(0))  ; derriere

;-- positionne chaque entity pour former les 6 faces du cube
RotateEntity(0,0,0,-90)     ; devant
RotateEntity(1,90,0,0)     ; face du bas
RotateEntity(2,0,90,0)     ; coté à droite
RotateEntity(3,270,0,0)    ; haut
RotateEntity(4,0,270,0)    ; coté à gauche
RotateEntity(5,180,0,-90)    ; face arrière

;-- creation de 6 entity pour chacune des 6 faces d'un pavé
CreateEntity(6,MeshID(1), MaterialID(0),-5,0,0)  ; devant
CreateEntity(7,MeshID(0), MaterialID(0),-5,0,0)  ; bas
CreateEntity(8,MeshID(1), MaterialID(0),-5,0,0)  ; droite
CreateEntity(9,MeshID(0), MaterialID(0),-5,0,0)  ; haut
CreateEntity(10,MeshID(1), MaterialID(0),-5,0,0)  ; gauche
CreateEntity(11,MeshID(1), MaterialID(0),-5,0,0)  ; derriere

;-- positionne chaque entity pour former les 6 faces du pavé
RotateEntity(6,0,0,0)     ; devant
RotateEntity(7,90,0,0)     ; face du bas
RotateEntity(8,0,90,0)     ; coté à droite
RotateEntity(9,90,0,0)    ; haut
RotateEntity(10,0,270,0)    ; coté à gauche
RotateEntity(11,180,0,180)    ; face arrière



;-- creation d'une colonne


x.f=0
y.f=0
angle=0
rayon=1
For j = 1 To 72
 x=rayon*Cos(Radian(Angle))
 y=rayon*Sin(Radian(Angle))

 CreateEntity(12+j,MeshID(2), MaterialID(1),10+x,0,10+y)  ; derriere
 RotateEntity(12+j,0,90-angle,0)     ; devant
 angle=angle+5
Next



 ; Create Static geometry
    StaticGeometry =  CreateStaticGeometry(#PB_Any, 100000, 100000, 100000, #False)
    
    
    
;-- Création d'un sol 

For j = 1 To 200
  For i = 1 To 200
    AddStaticGeometryEntity(StaticGeometry, 3, j, 0, i)
    
  Next i
Next j
  
    
;-- Création d'un plafond

For j = 1 To 200
  For i = 1 To 200
    AddStaticGeometryEntity(StaticGeometry, 1, j, 5, i)
    
  Next i
Next j



For j = 1 To 100
  x=Random(200)
  y=Random(5)+1
  z=Random(200)

  AddStaticGeometryEntity(StaticGeometry, 0, x, y, z)
  AddStaticGeometryEntity(StaticGeometry, 1, x, y, z)
  AddStaticGeometryEntity(StaticGeometry, 2, x, y, z)
  AddStaticGeometryEntity(StaticGeometry, 3, x, y, z)
  AddStaticGeometryEntity(StaticGeometry, 4, x, y, z)
  AddStaticGeometryEntity(StaticGeometry, 5, x, y, z)
Next


For i = 1 To 20
  x=Random(200)
  z=Random(200)

angle=0
  For j = 1 To 72
    AddStaticGeometryEntity(StaticGeometry, 12+j, x+(rayon*Cos(Radian(angle))), 0, z+(rayon*Sin(Radian(angle))))
    angle=angle+5
  Next

Next


  
; Build the Static geometry
    BuildStaticGeometry(StaticGeometry)



CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,-10,0,0)
CameraLookAt(0,0, 0, 0)
CameraFOV(0,45)

Deltaz.i=#Hauteur*2

;-
;-- Gestion des textes
;Chaine qui indique l'ordre des lettres contenues dans l'image
Global Strig$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789-"

; Déclaration de la procédre qui affiche les textes
; (Texte à afficher, position Y, taille, n° de sprite, max aléatoire pour faire trembler la lettre)
Declare AffT(TextMenu01$,y.i,sz.i,sprite.i,rnd.i)

; le texte est automatiquement centré
; Text$ = TExt à afficher
; y     =position y du text
; sz    =Taille de la police (sert pour le zomm des lettres et de l'espacement)
; sp    =Pointe sur le sprite A de la bonne police
; rnd   =valeur de tremblement des lettres
Procedure AffT(Text$,y.i,sz.i,sp.i,rnd.i)
sx=0:For i=1 To Len(Text$):For j=1 To Len(Strig$)
If Mid(Text$,i,1)=Mid(Strig$,j,1):a=sz+2
DisplaySprite3D(sp+j-1,sx+Random(rnd)+400-(Len(Text$)*a)/2,y+Random(rnd),200)
sx=sx+sz+2:j=Len(Strig$):EndIf :Next:Next
EndProcedure


;-
;-       BIG LOOP


Repeat
    ExamineMouse()
  ExamineKeyboard()
  ClearScreen(0)
  
  
  
    
 ;--- Gère la camera Cavier et souris   
       If KeyboardPushed(#PB_Key_Up)
          KeyY.f = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY.f = #CameraSpeed
        Else
          KeyY = 0
        EndIf
        
         If KeyboardPushed(#PB_Key_Right)
          BougeX.f = -#CameraSpeed/2
        ElseIf KeyboardPushed(#PB_Key_Left)
          BougeX = #CameraSpeed/2
        Else
          BougeX = 0
        EndIf 
     
      Yaw.f = MouseDeltaX() / 10
      Pitch.f = MouseDeltaY() / 10
     
      RotateCamera(0, -Pitch, Yaw, 0, #PB_Engine_Relative_Rotation | #PB_Engine_Euler_Rotation)
    
      
   

   MoveCamera  (0, KeyX-BougeX, -CameraY(0)+Deltaz, KeyY)
  
      RenderWorld()
      
       Start3D()
     
     
     
      AffT(Str(CountRenderedTriangles())+" TRIANGLES",0,6,0,0)
      AffT(Str(Engine3DFrameRate(#PB_Engine3D_Current))+" FPS",10,6,0,0)
      Stop3D()
      
      
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

End

;{ Définition des surfaces composées de 2 triangles chacune
DataSection
  Sommet_carre:
  Data.f -0.5,0.5,0.5
  Data.l $00FF00
  Data.f 0,0
 
  Data.f 0.5,0.5,0.5
  Data.l $00FF00
  Data.f 0,1
 
  Data.f 0.5,-0.5,0.5
  Data.l $00FF00
  Data.f 1,1
 
  Data.f -0.5,-0.5,0.5
  Data.l $00FF00
  Data.f 1,0
 
  ;Face
  Data.w 2,1,0
  Data.w 0,3,2
  
  Sommet_rectangle:
  Data.f -0.5,1,0.5
  Data.l $00FF00
  Data.f 0,0
 
  Data.f 0.5,1,0.5
  Data.l $00FF00
  Data.f 0,1
 
  Data.f 0.5,-1,0.5
  Data.l $00FF00
  Data.f 1,1
 
  Data.f -0.5,-1,0.5
  Data.l $00FF00
  Data.f 1,0
 
  ;Face
  Data.w 2,1,0
  Data.w 0,3,2
  
  Sommet_colonne:
  Data.f -0.1,4.5,0.1
  Data.l $00FF00
  Data.f 0,0
 
  Data.f 0.1,4.5,0.1
  Data.l $00FF00
  Data.f 0,1
 
  Data.f 0.1,0.5,0.1
  Data.l $00FF00
  Data.f 1,1
 
  Data.f -0.1,0.5,0.1
  Data.l $00FF00
  Data.f 1,0
 
  ;Face
  Data.w 2,1,0
  Data.w 0,3,2
  
  
  
EndDataSection
;}
Only PureBasic makes it possible
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Ar-S »

Arf j'attends la 4.60 qui doit pointer son nez en septembre.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

Un petit pas de plus !!

Well, avec la 4.6 RC1 et les posts du forum français et anglais de G-Rom et Comtois principalement que je remercie infiniment, j'ai consolidé mon avancée en 3D=> j'ai même fouillé très profond dans le forum et j'ai beaucoup appris :D

Je fais un éditeur de décor qui fonctionne par l'assemblage de dalles (rectangulaires pour l'instant), mais je pourrai intégrer d'autres formes géométriques pour des décors moins urbains et plus naturels et pour casser l'effet carré...

Comme les dalles sont indépendantes les unes des autres et pour assurer une jointure parfaite entre les dalles, j'ai programmé un magnétisme agissant entre chacun des points du mesh de l'entity que l'on est en train de positionner avec les autres meshs des entity déjà positionnés. Je peux copier-coller-supprimer les dalles...
C'est pas terrible à manipuler mais avec l'habitude et avec la grande tolérance du programmeur envers ses propres créations, j'arrive à construire des décors assez rapidement sans trop m'énerver :mrgreen:

Voici un petit décor à visualiser : http://xdji.free.fr/Telechargement/PlayerWorld.zip
Déplacement => fleches clavier + souris + molette souris

En code, il n'y a que le player car l'éditeur est imbuvable => je posterai une version ergonomique

Il me reste à ajouter un grand nombre de fonctions pour enrichir le MapEditor.
- déformer légèrement une surface pour casser l'effet trop plat et trop parfait d'un sol
- mettre des dalles animées ou animables (portes) => qui ne seront pas dans la StaticGeometry
- éclairage
- and more

Je vais aussi enrichir ma bibliothèque de textures et de géométries des mesh
Only PureBasic makes it possible
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Huitbit »

Hi !

Ca tourne nickel sur mon pc en carton :P .

Le mur est magnifique !
les tiles sont bien jointes.
Si j'avais un chien, je suis sûr qu'il apprécierait :lol: !

En tout cas, c'est très prometteur !


Hasta la vista !
Elevé au MSX !
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

Merci Huitbit & Hi aussi,

J'ai pensé à ton futur chien, je lui ai posé un tas de mur (en métal, ça se nettoie plus facilement :mrgreen: ).

Evolution du zinzin, j'ai perdu tout mon décor précédent car j'ai du modifier le format des mesh et j'ai refais un niveau de test avec les collisions sur le sol et les murs.
J'ai réussi des collisions sur des murs avec une orientation libre => c'est pas encore un peu rugueux mais j'en suis déjà bien content !

http://xdji.free.fr/Telechargement/PlayerWorld.zip

Prochain objectif, mettre en place des rampes avec différents étages...et surtout refaire un décor un peu plus grand.

ça me permettra de mettre en place un système de zone, style Quadtree, qui évite de tester les collisions avec toutes les dalles mais uniquement les plus proches... puis insérer des entitys dynamiques (portes, sas...), mesh transparent (fenetre), lampes et ombres (j'ai pas trop réussi, je sais pas si c'est la RC1 qui bug ou moi => enfin si je sais, c'est forcément moi !!!).
Only PureBasic makes it possible
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Ar-S »

tu peux compiler un petit exe que je test ^^
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

oki,

J'ai ajouté la nouvelle Engine3D.dll + 1 exe dans le zip précédent...

J'avais retravaillé le code entre temps. Ce n'est donc plus la même version.
En plus ya des tuilages à la rapide et j'ai du bouger la souris en meme temps => des trous dans le mur...

J'ai commencé à poser des dalles inclinées pour le sol pour tester les collisions mais la technique utilisée n'est pas terrible, je vais utiliser celle que j'utilise pour les murs, elle sera plus précise. Normalement, avec je pourrai intégrer des rampes, des escaliers, des ascenseurs, des étages, des falaises...

Pour l'affichage, j'utilise la staticgeometry, nouvelle fonction de la 4.6 qui permet de gerer un tres grand paquet d'entity statiques. Je pourrai ajouter des entitys indépendantes pour les élements mobiles. je vais essayer de mettre une porte coulissante automatique un de ces soirs.
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

Hop,

Petite actualisation du player...

http://xdji.free.fr/Telechargement/PlayerWorld.zip

Collisions latérales et horizontales, escalier...

Demain : samedi après-midi quartier libre (ma douce et les enfants vont chez une copine), donc 4 heures pour avancer comme un malade sur le projet :D
Je vais blinder les tests de collisions avant optimisation
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Labyrinthe 3D - début d'un nouveau projet

Message par G-Rom »

Je viens de testé sur windows 7 64 :oops:
Recherche un post avec Comtois comme auteur et "collision avec axe séparateur" et inspire toi en, je l'avais fait jadis avec mon engine3D perso :
http://www.dailymotion.com/video/x4w7y7 ... ic-3d_tech
ca marchais plutôt bien :P
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Labyrinthe 3D - début d'un nouveau projet

Message par Cool Dji »

Ok merci G-rom pour les liens.
Jolie la demo
C'est la mort assurée W 7 64 !!

J'ai vu le test de Comtois, j'analyse...
Only PureBasic makes it possible
Répondre