Aide pour mes débuts en 3D

Généralités sur la programmation 3D
Depix
Messages : 10
Inscription : dim. 18/janv./2009 2:25

Aide pour mes débuts en 3D

Message par Depix »

Salut tous le monde,
Voilà, j'ai décidé de commencer à faire du 3D avec Pure Basic, cependant, je ne trouve pas un tutoriel précis à suivre. Tous ce qu'il y a, c'est des bouts de codes, et des tutoriels pour faire des choses précises, tels que créer un cube ou autre, mais aucun tutoriel qui te montre comment s'y prendre du début à la fin. Même la documentation, y'a que des commandes et aucune explications.
Merci de me filer quelque liens.
Bonne journée :D
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message par guerrier001 »

Commence par le début , c'est a dire par la 2d.
Depix
Messages : 10
Inscription : dim. 18/janv./2009 2:25

Message par Depix »

:D Tu n'a quelque tutoriel par hasard à me filer ?
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message par guerrier001 »

Depix
Messages : 10
Inscription : dim. 18/janv./2009 2:25

Message par Depix »

Merci t'est sympa :wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Si tu ne les connaissais pas encore, tu trouveras quelques tutos ici
http://purebasic.developpez.com/cours/

Ils ne sont pas à jour pour la 4.30. Par contre j'ai commencé à mettre les sources à jour, elles sont disponibles ici :
http://purebasic.developpez.com/sources/?page=Pg_3D

Pour le déplacement d'une entity, le code est prêt pour la 4.30 mais je ne l'ai pas encore mis en ligne, le voici en exclusivité :)

Tu peux commencer à bosser ces codes, t'amuser à les modifier, c'est le meilleur moyen pour comprendre comment ça marche.

Code : Tout sélectionner

;PB 4.30 le 10/01/09

InitEngine3D()
InitSprite()
InitKeyboard()

;Pour enregistrer au format PNG
UsePNGImageEncoder()

ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "Tutoriel 3D")

;Pour charger une texture, mesh, entity , etc, indiquer le chemin où se trouvent ces médias
Add3DArchive("/", #PB_3DArchive_FileSystem)

Enumeration
  #VueDessus
  #VueArriere
  #VueCote
  #VueAvant
EndEnumeration

Global Angle.f, Vitesse.f
Define.l Options, ModeCamera, i

ModeCamera = #VueArriere

Macro NEW_X(x, Angle, Distance)
  ((x) + Cos((Angle) * 0.0174533) * (Distance))
EndMacro

Macro NEW_Z(z, Angle, Distance)
  ((z) - Sin((Angle) * 0.0174533) * (Distance))
EndMacro

;- Declaration des procédures
Declare.f CurveValue(actuelle.f, Cible.f, P.f)
Declare GestionCamera(Mode.l)

;-Mesh
#Mesh = 0
CreateMesh(#Mesh, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate
SetMeshData(#Mesh, Options      , ?Sommets, 24)
SetMeshData(#Mesh, #PB_Mesh_Face, ?Triangles, 12)

;-Textures
#Texture = 0
CreateImage(#Texture, 64, 64)

;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#Texture))
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), $FFFFFF)
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), 0)
StopDrawing()

;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP1.PNG"
SaveImage(#Texture, Fichier$, #PB_ImagePlugin_PNG)

;Maintenant on peut charger notre texture
LoadTexture(#Texture, Fichier$)


#TextureSol = 1
CreateImage(#TextureSol, 128, 128)

;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#TextureSol))
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $FFFFFF)
For i = 0 To 127 Step 10
  Line(i, 0, 0, ImageHeight(#TextureSol), $0000FF)
  Line(0, i, ImageWidth(#TextureSol), 0, $0000FF)
Next i

DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $000088)
StopDrawing()


;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP2.PNG"
SaveImage(#TextureSol, Fichier$, #PB_ImagePlugin_PNG)

;Maintenant on peut charger notre texture
LoadTexture(#TextureSol, Fichier$)

;-Matière
#Matiere = 0
CreateMaterial(#Matiere, TextureID(#Texture))

#MatiereSol = 1
CreateMaterial(#MatiereSol, TextureID(#TextureSol))

;-Entity
#Entity = 0
CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
ScaleEntity(#Entity, 10, 10, 10) ; Agrandi l'entity
EntityLocate(#Entity, 500, 5, 500)

#EntitySol = 1
CreateEntity(#EntitySol, MeshID(#Mesh), MaterialID(#MatiereSol))
ScaleEntity(#EntitySol, 1000, 2, 1000) ; Agrandi l'entity
EntityLocate(#EntitySol, 500, -5, 500)

;-Camera
#Camera = 0
CreateCamera(#Camera, 0, 0, 100, 100)

;-Light
AmbientColor(RGB(55,55,55)) ; Réduit la lumière ambiante pour mieux voir les lumières
#LightRouge = 0 : CreateLight(#LightRouge,RGB(255, 0, 0),    0, 500,    0)
#LightBleue = 1 : CreateLight(#LightBleue,RGB(0, 0, 255),    0, 500, 1000)
#LightVerte = 2 : CreateLight(#LightVerte,RGB(0, 255, 0), 1000, 500, 1000)

;- Sprite pour afficher l'aide
CreateSprite(0,600,30)
StartDrawing(SpriteOutput(0))
  DrawText(0,0,"Touches [F1] - [F2] - [F3] - [F4] pour changer la vue de la caméra", $FF0000, $00FFFF)
StopDrawing()

Repeat
  
  Vitesse = 60/Engine3DFrameRate(#PB_Engine3D_Current)
  
  If ExamineKeyboard()
    ;Change la vue de la caméra
    If KeyboardReleased(#PB_Key_F1)
      ModeCamera = #VueDessus
    ElseIf KeyboardReleased(#PB_Key_F2)
      ModeCamera = #VueArriere
    ElseIf KeyboardReleased(#PB_Key_F3)
      ModeCamera = #VueCote
    ElseIf KeyboardReleased(#PB_Key_F4)
      ModeCamera = #VueAvant
    EndIf

    If KeyboardPushed(#PB_Key_Left)
      Angle + Vitesse
      RotateEntity(#Entity, 0, Angle, 0, #PB_Absolute)
    ElseIf KeyboardPushed(#PB_Key_Right)
      Angle - Vitesse
      RotateEntity(#Entity, 0, Angle, 0, #PB_Absolute)
    EndIf

    If KeyboardPushed(#PB_Key_Up)
      MoveEntity(#Entity, NEW_X(0, Angle , Vitesse), 0, NEW_Z(0, Angle, Vitesse))
    ElseIf KeyboardPushed(#PB_Key_Down)
      MoveEntity(#Entity, NEW_X(0, Angle , -Vitesse), 0, NEW_Z(0, Angle, -Vitesse))
    EndIf

  EndIf

  GestionCamera(ModeCamera)

  RenderWorld()

  DisplayTransparentSprite(0,0,0)

  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)


Procedure.f CurveValue(actuelle.f, Cible.f, P.f)
  ;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible
  Define.f Delta
  Delta = Cible - actuelle
  If P > 1000.0 : P = 1000.0 : EndIf
  ProcedureReturn  (actuelle + ( Delta * P / 1000.0))
EndProcedure

Procedure GestionCamera(Mode.l)
  Define.f Px, Py, Pz, Pv
  Static AngleCamera.f

  Pv = 25*(60/Engine3DFrameRate(#PB_Engine3D_Current))

  Select Mode

    Case #VueDessus
      AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
      Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 40), Pv)
      Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 140, Pv)
      Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 40), Pv)

    Case #VueArriere
      AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
      Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
      Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
      Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)

    Case #VueCote
      AngleCamera = CurveValue(AngleCamera, Angle + 120, Pv)
      Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
      Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
      Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)

    Case #VueAvant
      AngleCamera = CurveValue(AngleCamera, Angle, Pv)
      Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
      Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
      Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)

  EndSelect

  CameraLocate(#Camera, Px, Py, Pz)
  CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
EndProcedure


;{ Définition du cube
DataSection
  Sommets:
  ;Dessus 0 à 3
  Data.f -0.5,0.5,-0.5
  Data.f 0,1,0
  Data.l 0
  Data.f 0,0

  Data.f 0.5,0.5,-0.5
  Data.f 0,1,0
  Data.l 0
  Data.f 0,1

  Data.f 0.5,0.5,0.5
  Data.f 0,1,0
  Data.l 0
  Data.f 1,1

  Data.f -0.5,0.5,0.5
  Data.f 0,1,0
  Data.l 0
  Data.f 1,0

  ;Dessous 4 à 7
  Data.f -0.5,-0.5,0.5
  Data.f 0,-1,0
  Data.l 0
  Data.f 0,0

  Data.f 0.5,-0.5,0.5
  Data.f 0,-1,0
  Data.l 0
  Data.f 0,1

  Data.f 0.5,-0.5,-0.5
  Data.f 0,-1,0
  Data.l 0
  Data.f 1,1

  Data.f -0.5,-0.5,-0.5
  Data.f 0,-1,0
  Data.l 0
  Data.f 1,0

  ;Devant 8 à 11
  Data.f -0.5,0.5,0.5
  Data.f 0,0,1
  Data.l 0
  Data.f 0,0

  Data.f 0.5,0.5,0.5
  Data.f 0,0,1
  Data.l 0
  Data.f 0,1

  Data.f 0.5,-0.5,0.5
  Data.f 0,0,1
  Data.l 0
  Data.f 1,1

  Data.f -0.5,-0.5,0.5
  Data.f 0,0,1
  Data.l 0
  Data.f 1,0

  ;Derrière 12 à 15
  Data.f 0.5,0.5,-0.5
  Data.f 0,0,-1
  Data.l 0
  Data.f 0,0

  Data.f -0.5,0.5,-0.5
  Data.f 0,0,-1
  Data.l 0
  Data.f 0,1

  Data.f -0.5,-0.5,-0.5
  Data.f 0,0,-1
  Data.l 0
  Data.f 1,1

  Data.f 0.5,-0.5,-0.5
  Data.f 0,0,-1
  Data.l 0
  Data.f 1,0

  ;Cote gauche 16 à 19
  Data.f -0.5,0.5,-0.5
  Data.f -1,0,0
  Data.l 0
  Data.f 0,0

  Data.f -0.5,0.5,0.5
  Data.f -1,0,0
  Data.l 0
  Data.f 0,1

  Data.f -0.5,-0.5,0.5
  Data.f -1,0,0
  Data.l 0
  Data.f 1,1

  Data.f -0.5,-0.5,-0.5
  Data.f -1,0,0
  Data.l 0
  Data.f 1,0

  ;Cote droit 20 à 23
  Data.f 0.5,0.5,0.5
  Data.f 1,0,0
  Data.l 0
  Data.f 0,0

  Data.f 0.5,0.5,-0.5
  Data.f 1,0,0
  Data.l 0
  Data.f 0,1

  Data.f 0.5,-0.5,-0.5
  Data.f 1,0,0
  Data.l 0
  Data.f 1,1

  Data.f 0.5,-0.5,0.5
  Data.f 1,0,0
  Data.l 0
  Data.f 1,0

  Triangles:
  ;Face en Haut
  Data.w 2,1,0
  Data.w 0,3,2
  ;Face en Bas
  Data.w 6,5,4
  Data.w 4,7,6
  ;Face Avant
  Data.w 10,9,8
  Data.w 8,11,10
  ;Face Arrière
  Data.w 14,13,12
  Data.w 12,15,14
  ;Face Gauche
  Data.w 18,17,16
  Data.w 16,19,18
  ;Face Droite
  Data.w 22,21,20
  Data.w 20,23,22
EndDataSection
;}
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.
Depix
Messages : 10
Inscription : dim. 18/janv./2009 2:25

Message par Depix »

WoW mec, sa déchire vraiment ton truc.
Merci, je vais faire un tour.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Salut Comtois,

C'est exactement le code qu'il manquait pour démarrer la 3D avec la nouvelle version. Merci beaucoup pour ton travail.

Par contre, j'ai un problème : impossible de créer un sprite... J'ai enlevé cette partie là (création + affichage de sprite)

J'ai un GPU interne baptisé VIA Chrome9 HC3 IGP avec 64Mo. La carte vidéo porte le même nom.

Ton premier exemple que tu voulais mettre dans l'aide (pour les fenêtres 3D + les gadgets 3D) crashait net (PureBasic00N.EXE a rencontré une erreur, etc...) Donc pas de 3D dispo auparavant.

Je vais tester les fonctions de base sur les sprites pour voir...

Ollivier
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Les sprites seuls fonctionnent. Idem pour les sprites 3D. Par contre, dès que je rajoute InitEngine3D(), il m'est impossible de créer un sprite. Je vais mettre ça dans le bug report...

En tout cas, merci

Ollivier
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

à olivier:
essaye de mettre à jour ton directX et les pilotes de ta carte graphique
ça peut aider.

à comtois:
il a fallu que je vire le createsprite et le displaytransparentsp... pour que le prog. fonctionne ?

pat
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Patrick88 a écrit :à olivier:
essaye de mettre à jour ton directX et les pilotes de ta carte graphique
ça peut aider.
@Pat

Aucun problème avec mes pilotes : tout est impeccable!
Patrick88 a écrit :à comtois:
il a fallu que je vire le createsprite et le displaytransparentsp... pour que le prog. fonctionne ?
@Pat

C'est exactement ce que j'ai dû faire avant d'en conclure au bug cité plus haut.

Logiquement, tu devrais obtenir une erreur à ce code-ci

Code : Tout sélectionner

InitEngine3D()
InitSprite()
SprX.L = CreateSprite(-1, 64, 64)
If SprX = 0
  Debug "Sprite non créé!"
EndIf
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

exact, la doc dit que initengine3d et initsprite tente d'initialiser DirectX 7

est ce qu'il n'yaurait pas un conflit ?

pat
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Sûrement, mais apparemment pas sur toutes les bécanes puisque Comtois n'a pas ce problème. Peut-être devrais-tu préciser le nom de ta carte graphique dans le rapport de bug. ça aidera sûrement à résoudre le problème.

Ollivier
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

XP Home Service Pack 3
P5K SE
Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz (2 CPUs)
Memory: 3328MB RAM
Page File: 308MB used, 4901MB available
DirectX Version: DirectX 9.0c (4.09.0000.0904)

Card name: NVIDIA GeForce 8800 GTX
Display Memory: 768.0 MB
Current Mode: 1680 x 1050 (32 bit) (60Hz)

c'est fait.

pat
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

et tu as bien sélectionné le sous système directx9 ?
on ne peut pas créer de sprite avec directx7 si InitEngine3D() est actif.
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