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

Généralités sur la programmation 3D
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Simpa :)
J'ai tout en rouge en Additive aussi...

La diff entre ton code et celui de Fred, c'est que Fred utilise son Screen3DRequester qui ouvre un plein ecran en 16 alors que les ombres fonctionnent qu'en 32 en plein ecran.

Voilas ma ptite contrib aussi, j'essay de recreer l'ambience de mes Dem0xKx.

Les datas :
http://cederavic.serveurperso.com/Dem01k1.rar

Le code :
[Attention, je n'utilise pas la lib en Userlib, j'inclu directement la source!]

Code : Tout sélectionner


#MaxTileX = 11
#MaxTileY = 11
#CameraSpeed = 3
#MatrixSize = 1024

IncludeFile "Screen3DRequester.pb"
IncludeFile "m3d_inc.pb"

DefType.f KeyX, KeyY, MouseX, MouseY

Global MouseState.b

ThunderT1.l
ThunderT2.l
ThunderT3.l
Thunder.l

NewList Rain.f()

Procedure LoadMap(File.s)
    ; Charge la map
    OpenFile(0, File)
    For y = 0 To #MaxTileX
      For x = 0 To #MaxTileY
        
        Tile = ReadLong()
        M3D_TextureFacette(0, x, y, Tile)
        If Tile <> 95
          M3D_SetVertexHeight(0, x, y, 0)
        EndIf
        
      Next
    Next
    CloseFile(0)
    
    M3D_UpdateMatrix(0)
  EndProcedure

; Initialisations
If InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse() And InitSound()

  Add3DArchive("Data\", #PB_3DArchive_FileSystem)

  M3D_Matrice_Init()
  
  If Screen3DRequester()
    AmbientColor(RGB(0,0,0))
    
    ; Chargements
    
    LoadSound(0, "Data\rain3.wav")
    LoadSound(1, "Data\rain.wav")
    
    LoadTexture(1, "Tiles.png")
    LoadTexture(2, "Tile_Detail.png")
    LoadTexture(3, "Clouds.jpg")
    LoadTexture(4, "Clouds2.png")
    LoadTexture(5, "Clouds_g.png")
    LoadTexture(6, "rain.jpg")
    
    LoadTexture(7, "bark.png")
    LoadTexture(8, "leaf.png")
    
    ; Creation des matrices
    M3D_CreateMeshMatrix(0, 1, 1, 12, 12, 0)
    M3D_RandomizeMatrix(0, 24)
    
    M3D_PrepareMatrixTexture(0, 1, 8, 12)

    LoadMap("test.map")
    For x = 0 To 12
      For z = 0 To 12
      
        If x = 0 Or x = 12 Or z = 0 Or z = 12
          M3D_SetVertexHeight(0, x, z, 0)
        EndIf
      
      Next
    Next
    M3D_UpdateMatrix(0)
    
    ; Chargement des mesh
    LoadMesh(50, "Skydome.mesh")
    LoadMesh(51, "oak_part1.mesh")
    LoadMesh(52, "oak_part2.mesh")
    
      
    ; Creation des materiaux
    CreateMaterial(1, TextureID(1))
      AddMaterialLayer(1, TextureID(2), 1)
      AddMaterialLayer(1, TextureID(5), 0)
      MaterialShadingMode(1, #PB_Material_Gouraud)
      MaterialAmbientColor(1, RGB(0, 0, 0))
      ScrollMaterial(1, 0.05, 0.02, #PB_Material_Animated, 2)
      
    CreateMaterial(2, TextureID(3))
      AddMaterialLayer(2, TextureID(4), 1)
      ScrollMaterial(2, 0.5, 0.07, #PB_Material_Animated)
      ScrollMaterial(2, 0.2, 0.02, #PB_Material_Animated, 1)
      
      DisableMaterialLighting(2, 1)
      
    CreateMaterial(3, TextureID(6))
      MaterialBlendingMode(3, #PB_Material_Add)
      DisableMaterialLighting(3, 1)
      
    CreateMaterial(4, TextureID(7))
      
    CreateMaterial(5, TextureID(8))
      MaterialBlendingMode(5, #PB_Material_AlphaBlend)
    
    ; Creation des entités
    For x = 0 To 5
      For z = 0 To 5
        t + 1
        CreateEntity (t, MeshID(0), MaterialID(1))
        ScaleEntity(t, #MatrixSize, 1, #MatrixSize)
        EntityLocate(t, x * #MatrixSize, 0, z * #MatrixSize)
        EntityRenderMode(t, 0)
      Next
    Next
    
    CreateEntity(50, MeshID(50), MaterialID(2))
      EntityRenderMode(50, 0)
      ScaleEntity(50, 10, 10, 10)
    
    
    For tTree = 100 To 160 Step 2
      CreateEntity(tTree, MeshID(51), MaterialID(4))
      CreateEntity(tTree + 1, MeshID(52), MaterialID(5))
        ScaleEntity(tTree, 3, 3.2, 3)
        ScaleEntity(tTree + 1, 3, 3.2, 3)
        EntityRenderMode(tTree + 1, 0)
    Next
    
    ; Creation des billboard pour l'effet de pluie
    CreateBillboardGroup(0, MaterialID(3), 64, 64)
      For t = 0 To 100
        AddElement(Rain())
          Rain() = Random(150)
          rx.f = (Random(29900) - 14800) / 100
          rz.f = (Random(29900) - 14800) / 100
          If rx > -5 And rx < 5 : rx = 2048 : EndIf
          If rz > -5 And rz < 5 : rz = 2048 : EndIf
          AddBillboard(t, 0, rx, Rain(), rz)
          
      Next
    
    ; La lumiere... 
    CreateLight(0, RGB(110,125,170),  2.5 * 1024, 1024 ,2.5 * 1024)
    
    ; Config de la camera
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,2.5 * 1024,50,2.5 * 1024)
    CameraRange(0, 1, #MatrixSize * 2 )
    Fog(RGB(60, 80, 130), 10, 300, 500)
    
    ; Placement des arbres
    For tTree = 100 To 160 Step 2
      tx.f = Random(#MatrixSize * 5)
      tz.f = Random(#MatrixSize * 5)
      
      MapX = Round(tx / #MatrixSize, 0)
      MapZ = Round(tz / #MatrixSize, 0)
    
      Height.f = M3D_GetGroundHeight(0, (tx + 150 - MapX * #MatrixSize) / #MatrixSize, (tz - MapZ * #MatrixSize) / #MatrixSize)
      EntityLocate(tTree, tx, Height - 2, tz)
      EntityLocate(tTree + 1, tx, Height - 2, tz)
      
      r = Random(360)
      RotateEntity(tTree, r, 0, 0)
      RotateEntity(tTree + 1, r, 0, 0)
    Next
    
    
    
    ; Init Thunder Effect
    ThunderT1 = GetTickCount_()
    ThunderT3 = Random(5000) + 4000
    SoundVolume(0, 70)
    PlaySound(0, 1)
      
    Repeat
      Screen3DEvents()
      
      ClearScreen(0, 0, 0)
      
      ; Mouvement      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
        If KeyboardReleased(#PB_Key_L)
          LoadMap("test.map")
        EndIf
        
        If KeyboardReleased(#PB_Key_Space)
          If MouseState = 0
            ReleaseMouse(1)
            MouseState = 1
          Else
            ReleaseMouse(0)
            MouseState = 0
          EndIf
        EndIf

      EndIf
      
      If MouseState = 0
        If ExamineMouse()
          MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
          MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
        EndIf
      EndIf
      
      ; Rain effect
      tRain = 0
      ForEach Rain()
      
        Rain() - 4
      
        BillboardLocate(tRain, 0, BillboardX(tRain, 0), Rain(), BillboardZ(tRain, 0))
        
        If BillboardY(tRain, 0) < CameraY(0) - 128
          Rain() = Random(150)
          rx.f = (Random(40000) - 20000) / 100
          rz.f = (Random(40000) - 20000) / 100
          BillboardLocate(tRain, 0, rx, Rain(), rz)
        EndIf
        
        tRain + 1
      Next
      
      BillboardGroupLocate(0, CameraX(0), CameraY(0), CameraZ(0))
      RotateBillboardGroup(0, -0.2, 0, 0.03)
      
      ; Positionement  camera, lumiere et skydome
      MapX = Round(CameraX(0) / #MatrixSize, 0)
      MapZ = Round(CameraZ(0) / #MatrixSize, 0)
      
      Height.f = M3D_GetGroundHeight(0, (CameraX(0) - MapX * #MatrixSize) / #MatrixSize, (CameraZ(0) - MapZ * #MatrixSize) / #MatrixSize)
      
      RotateCamera(0, MouseX, MouseY, RollZ)
      MoveCamera  (0, KeyX, -CameraY(0)+Height+32, KeyY)
      
      LightLocate(0, CameraX(0), CameraY(0) + 32, CameraZ(0))
      EntityLocate(50, CameraX(0), 0, CameraZ(0))
      
      RenderWorld()
      
      ; Thunder Effect
      ThunderT2 = GetTickCount_() - ThunderT1
      If ThunderT2 >= ThunderT3
        ThunderT1 = GetTickCount_()
        ThunderT3 = Random(10000) + 20000
        Thunder = 1
      
        PlaySound(1, 0)
      EndIf
      
      Select Thunder
      
        Case 0
      
        Case 1
          ClearScreen(255, 255, 255)
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 2
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 3
          ClearScreen(0, 0, 0)
          AmbientColor(RGB(0, 0, 0))
          MaterialAmbientColor(1, RGB(0, 0, 0))
          Thunder + 1
          
        Case 5
          AmbientColor(RGB(0, 0, 0))
          MaterialAmbientColor(1, RGB(0, 0, 0))
          Thunder + 1
          
        Case 6
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 8
          AmbientColor(RGB(0, 0, 0))
          MaterialAmbientColor(1, RGB(0, 0, 0))
          Thunder + 1
          
        Case 9
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 13
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 14
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 15
          AmbientColor(RGB(0, 0, 0))
          MaterialAmbientColor(1, RGB(0, 0, 0))
          Thunder + 1
          
        Case 16
          AmbientColor(RGB(255, 255, 255))
          MaterialAmbientColor(1, RGB(255, 255, 255))
          Thunder + 1
          
        Case 20
          AmbientColor(RGB(0, 0, 0))
          MaterialAmbientColor(1, RGB(0, 0, 0))
          Thunder = 0
          
        Default
          Thunder + 1
      
      EndSelect
      
      Screen3DStats()
      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End

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

Message par comtois »

La diff entre ton code et celui de Fred, c'est que Fred utilise son Screen3DRequester qui ouvre un plein ecran en 16 alors que les ombres fonctionnent qu'en 32 en plein ecran.
Exact , je n'avais pas vu ça , merci pour l'info.

Sinon j'ai testé ta démo , bien vu :)

Un truc qui m'étonne , ta matrice ne bug pas ? tu as changé quelque chose ?
J'ai un bug avec les matrices si le coin en haut à gauche sort de l'écran , la matrice n'est plus du tout affichée ! et apparemment , ça ne le fait pas avec ta démo ? à moins que ça soit comme avec le plain de Fred , il faut tourner tout doucement pour trouver l'angle mort , et hop on a plus rien à l'écran , je vais tester à nouveau avec ta démo .

[EDIT]
J'ai vu que tu as défini la largeur et profondeur de ton mesh à 1x1 , j'ai essayé en faisant ça , avec un scale de l'entity ,le problème est moins visible , mais il existe quand même :?

Bon il y a encore pas mal de bugs dans cette beta d'ogre
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 »

une démo qui utilise la lib Matrix3D ( vous n'avez pas besoin de la lib, il n'y a qu'un exe pour l'instant )

idem je mettrai les sources quand j'aurai dépoussiéré.

http://perso.wanadoo.fr/comtois/sources ... errain.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 »

J'ai repris l'exemple Cave Runner , cette fois ci la caméra se remet en origine quand on perd.
C'était l'exemple 8 dans l'ancienne version de M3D_Matrix3D

Il y a un exe et une texture pour tester.
http://perso.wanadoo.fr/comtois/sources/CaveRunner.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 »

C'est le dernier code source , avec la bilio et le résident.
Rien de nouveau , sauf que quelqu'un m'a signalé que ça ne fonctionnait plus avec la v4. ça fait un moment que j'ai compilé la bilio avec Tailbite, je ne sais pas si ça fonctionnera encore, sinon y'a le source pour le faire soi même :)

http://perso.wanadoo.fr/comtois/sources ... x3DV2i.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.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

Terrible la caverne, ça fais un peu ambiance Magic Carpet... :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je n'avais pas mis le code, le voici .
Je viens de le tester , il tourne avec la lib et PB4 beta11.

Code : Tout sélectionner

; Reprise d'un code darkbasic => Cave Runner Demo , Author : DBS-lb , 1st Sept 99
; Exemple No 8 
; Comtois le 24 avril 2006
; PB4 beta 11

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

;/Entity
Enumeration 
  #Matrix1 
  #Matrix2
EndEnumeration
;/Texture
#Texture = 0
#PB_Entity_Wireframe  = 1 << 0

;/Matière
#Matiere = 0

;- Variables
Global AngleCamera.f 
Global Hauteur.f

;{- 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_Matrix3D" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf
;}

Add3DArchive("\", #PB_3DArchive_FileSystem)	

;- Fonte
LoadFont (0, "Arial", 30)           

;- Texture
UsePNGImageDecoder()
If LoadImage(0,  "Tiles.png")
  CreateTexture(#Texture,ImageWidth(0), ImageHeight(0))
  StartDrawing(TextureOutput(#Texture))
  DrawImage(ImageID(0),0,0)
  StopDrawing()
EndIf
;- MAtière
CreateMaterial(#Matiere, TextureID(#Texture))

;-Mesh
M3D_CreateMeshMatrix(#Matrix1, 2000, 5000, 10, 25, 1)
M3D_CreateMeshMatrix(#Matrix2, 2000, 5000, 10, 25, 1)

;- Entity
CreateEntity(#Matrix1, MeshID(#Matrix1), MaterialID(#Matiere))

M3D_PrepareMatrixTexture(#Matrix1, #Texture, 2, 2)
M3D_FillMatrix(#Matrix1, 0)
M3D_NormalesMatrix(#Matrix1)
M3D_UpDateMatrix(#Matrix1)
EntityRenderMode(#Matrix1,#PB_Entity_Wireframe)

CreateEntity(#Matrix2, MeshID(#Matrix2), MaterialID(#Matiere))
EntityRenderMode(#Matrix2,#PB_Entity_Wireframe)
M3D_PrepareMatrixTexture(#Matrix2, #Texture, 2, 2)
M3D_FillMatrix(#Matrix2, 1)
M3D_RandomizeMatrix(#Matrix2, 350)
For x = 0 To 9
  M3D_SetVertexHeight(#Matrix2, x, 25, M3D_GetVertexY(#Matrix2,x,0))
Next x
For t=0 To 25
	M3D_SetVertexHeight(#Matrix2, 0, t, -100)
	M3D_SetVertexHeight(#Matrix2, 10, t, -100)
Next t
M3D_NormalesMatrix(#Matrix2)
M3D_UpDateMatrix(#Matrix2) 


;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0, EntityX(#Matrix1) , 15, EntityZ(#Matrix1))
CameraLookAt(0, EntityX(#Matrix2), 50, 0)

;- Light
AmbientColor(RGB(85,85,85)) 
CreateLight(0,RGB(255,255,255),1000,50,1500)
CreateLight(1,RGB(255,55,55),500,50,1500)
CreateLight(2,RGB(55,55,255),1500,50,1500)
;-Procedures
;Un peu de brouillard
Fog(RGB(0,0,0), 5, 1000, 2300) 

RandomSeed(ElapsedMilliseconds())

Repeat
  ;Initialise variables
  x = 0
  Z = 0
  speed.f = 0
  rz.f = 0
  Compteur = 0
  Temps = ElapsedMilliseconds()
  AngleCamera = 0
  M3D_FillMatrix(#Matrix1, 0)
  M3D_SetMatrixHeight(#Matrix1, 0)
  M3D_UpDateMatrix(#Matrix1)
  EntityLocate(#Matrix1,0, 0, 0)
  EntityLocate(#Matrix2,0, 100, 0)
  
  CameraLocate(0, EntityX(#Matrix1) + 1000, 50, EntityZ(#Matrix1)+2500)
  CameraLookAt(0, EntityX(#Matrix2) + 1000, 15, 0)
  
  Repeat
  	ClearScreen(0)	
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)
      speed + 1
    Else 
      speed -1
    EndIf  
    If KeyboardPushed(#PB_Key_Left)
      rz + 0.5
    EndIf  
    If KeyboardPushed(#PB_Key_Right)
      rz - 0.5
    EndIf  
    
    ; Mémorisation des anciennes coordonnées
    oldx = x
    oldgy.f = gy
    
    ; Gestion de la vitesse
    If speed < 0  : speed = 0   : EndIf
    If speed < 10 : speed + 1.1 : EndIf
    If speed >40  : speed =40   : EndIf
    
    ; Gestion tangage
    rz = rz / 1.1
    x = x - (2 * rz)
    
    ; déroulement du paysage
    Z + speed
    If Z > 200
      Z - 200
      ; 25%
      If Random(100)<25
        mp - 1
        mp + Random(3)
        If mp < 1 : mp = 1 : EndIf
        If mp > 4 : mp = 4 : EndIf
      EndIf
      M3D_SetVertexHeight(#Matrix1, 0, 1, 450) 
      M3D_TextureFacette(#Matrix1,0,0,1) 
      For t = 1 To mp        
        M3D_SetVertexHeight(#Matrix1, t, 1, Random(200))
        M3D_TextureFacette(#Matrix1,t,0,1) 
      Next t
      For t = mp + 1 To mp + 1 
        M3D_SetVertexHeight(#Matrix1, t, 1, Random(100))
        M3D_TextureFacette(#Matrix1,t,0,2) 
      Next t
      For t = mp + 2 To mp + 3 
        M3D_SetVertexHeight(#Matrix1, t, 1, Random(20)) 
        M3D_TextureFacette(#Matrix1,t,0,0) 
        Next t
      For t = mp + 4 To mp + 4 
        M3D_SetVertexHeight(#Matrix1, t, 1, Random(100))
        M3D_TextureFacette(#Matrix1,t,0,3)
      Next t
      For t = mp + 5 To 9   
        M3D_SetVertexHeight(#Matrix1, t, 1, Random(200))
        M3D_TextureFacette(#Matrix1,t,0,1)
      Next t
      Compteur + 1
      M3D_SetVertexHeight(#Matrix1, 10, 1, 450)                                        
      M3D_ShiftDown(#Matrix1)
      M3D_ShiftDown(#Matrix2)
      M3D_UpDateMatrix(#Matrix1)
      M3D_UpDateMatrix(#Matrix2)
    EndIf
    
    ;Positionne les matrices
    EntityLocate(#Matrix1, 0, 0  , z)
    EntityLocate(#Matrix2, 0, 100,  z)
    
    ; Positionne la camera
    Hauteur.f = M3D_CurveValue(Hauteur, M3D_GetGroundHeight(#Matrix1,1000 + x, 2500 - z) + 50, 300)
    CameraLocate(0, 1000 + x, Hauteur, 2500)  
    LightLocate(0,CameraX(0),CameraY(0),2000)
    Ecart.f=M3D_EcartAngle(AngleCamera , rz)
    RotateCamera(0,0,0, Ecart*7)
    AngleCamera = rz
    RenderWorld()
    
    
    StartDrawing(ScreenOutput())
      FrontColor(RGB(200,200,100))
      DrawingMode(1)                           
      DrawingFont(FontID(0))   
      DrawText(10,10,Str(Compteur) + " / " + StrF((ElapsedMilliseconds()-Temps)/1000,2))
      T$ = Str(score)
      DrawText(#ScreenWidth - TextWidth(T$),10,T$)
    StopDrawing()
    FlipBuffers()
    
  Until M3D_GetGroundHeight(#Matrix2, 1000 +  x, 2500 - z) < Hauteur - 50 Or KeyboardPushed(#PB_Key_Escape)
    For c = 0 To 200 Step 10
      ClearScreen(RGB(c,0,0))
      FlipBuffers()
    Next c
    If Compteur > score 
      score = Compteur
    EndIf  
      
Until KeyboardPushed(#PB_Key_Escape) 
  
End
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 »

c'est soirée vide grenier, je viens de retrouver ce bout de code, je ne sais plus si je l'avais déjà mis sur le forum, bon les calculs pour les roues sont à revoir , parfois elles quittent le chassis du mobile, mais pas trop, ça fait cartoon , y'a qu'à dire ça pour que ça passe :)

Ce code utilise la lib dispo dans fichier quelque part dans ce post, la lib n'a pas évolué, j'attends la nouvelle 3D et dx9 avant de la reprendre.

C'est juste une démo montrant comment créer un terrain et déplacer un véhicule dessus. j'ai ensuite ajouté les roues, mais là y'a encore du boulot pour que ça suive correctement !

Sans les roues et avec une voiture ou un tank ça peut faire illusion.

Code : Tout sélectionner

; Comtois le 05/08/2006
; Version PB 4.0 

;-Constantes
Enumeration
  #Matrix1
  #Mobile
  #RoueAVG
  #RoueAVD
  #RoueARG
  #RoueARD
EndEnumeration

#CameraSpeed = 4
Structure RHD_Vecteur
  x.f
  y.f
  z.f
EndStructure
Structure s_Collision 
	RayonEllipsoide.RHD_vecteur ;  Rayon de l'ellipsoide
 	;Informations sur le déplacement dans le monde R3
 	VitesseDansR3.RHD_Vecteur
 	PositionDansR3.RHD_Vecteur
 	;Changement de Base vectorielle, BaseE = Base de l'ellipsoide
 	VitesseDansBaseE.RHD_Vecteur
 	VitesseDansBaseENormee.RHD_Vecteur
 	PointOrigine.RHD_Vecteur
 	;Informations collisions
 	CollisionDetectee.l
 	DistanceLaPlusCourte.f
 	PointIntersection.RHD_Vecteur
EndStructure

Structure Camera
 AngleX.l       ; angle de la camera 
	AngleY.f
 Distance.l     ; distance entre la camera et le perso 
 Hauteur.l      ; hauteur de la camera 
 PosY.f
EndStructure
Structure Parametres
  AngleX.f   
  AngleY.f
  AngleZ.f      ;  
  Pas.l            ;Valide déplacement    
EndStructure
;-Variables
Global MouseX.f,MouseY.f
Global Camera.Camera, Joueur.Parametres

Camera\Hauteur= 120 
Camera\Distance=295 

;Information Joueur 
InfosEntity.s_Collision
With InfosEntity
\PositionDansR3\x  = 1000
\PositionDansR3\y  = 800
\PositionDansR3\z  = 1000
\VitesseDansR3\x   = 0.0
\VitesseDansR3\y   = 0.0
\VitesseDansR3\z   = 0.0
\RayonEllipsoide\x = 16
\RayonEllipsoide\y = 16
\RayonEllipsoide\z = 16
EndWith

;Declare procédures
Declare 	CouleurTerrain(No)


;- 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 Or InitMouse()=0
 MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
 End
ElseIf OpenScreen( 800 , 600 , 32 , "M3D_Matrix3D" ) = 0
 MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
 End
EndIf



;- Mesh
M3D_CreateMeshMatrix(#Matrix1,3000,3000,100,100,0)
M3D_CreateMesh(#Mobile,#M3D_Cube)
M3D_CreateMesh(#RoueAVG,#M3D_Cylinder)
;-Textures
CreateTexture(#Matrix1,128,128)
StartDrawing(TextureOutput(#Matrix1))
Box(0,0,128,128,RGB(255,255,255))
StopDrawing()  


CreateTexture(#Mobile,128, 128) 
StartDrawing(TextureOutput(#Mobile))
Box(0,0,TextureWidth(#Mobile),TextureHeight(#Mobile),RGB(85,155,55))
For i=0 To 127 Step 32
  Line(i,0,0,128,RGB(0,0,150))
  Line(0,i,128,0,RGB(0,0,150))
Next i  
StopDrawing() 
CreateTexture(#RoueAVG,128, 128) 
StartDrawing(TextureOutput(#RoueAVG))
Box(0,0,TextureWidth(#RoueAVG),TextureHeight(#RoueAVG),RGB(185,55,155))
StopDrawing() 
;- Material
CreateMaterial(#Matrix1, TextureID(#Matrix1))
MaterialAmbientColor(#Matrix1, -1)
CreateMaterial(#Mobile, TextureID(#Mobile))
CreateMaterial(#RoueAVG, TextureID(#RoueAVG))
;- Entity
CreateEntity(#Matrix1, MeshID(#Matrix1),MaterialID(#Matrix1))

M3D_CreateMeshTerrain(#Matrix1,300,3)

EntityLocate(#Matrix1, 0, 0, 0)

M3D_NormalesMatrix(#Matrix1)
M3D_UpDateMatrix(#Matrix1)

CreateEntity(#Mobile,MeshID(#Mobile),MaterialID(#Mobile))
EntityLocate(#Mobile, 1000, 0, 1000)
ScaleEntity(#Mobile,64,6,64)
Joueur\AngleX = 0


CreateEntity(#RoueAVG,MeshID(#RoueAVG),MaterialID(#RoueAVG))
CreateEntity(#RoueAVD,MeshID(#RoueAVG),MaterialID(#RoueAVG))
CreateEntity(#RoueARG,MeshID(#RoueAVG),MaterialID(#RoueAVG))
CreateEntity(#RoueARD,MeshID(#RoueAVG),MaterialID(#RoueAVG))
ScaleEntity(#RoueAVG,32,6,32)
ScaleEntity(#RoueAVD,32,6,32)
ScaleEntity(#RoueARG,32,6,32)
ScaleEntity(#RoueARD,32,6,32)

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,200,0)

;- Light
AmbientColor(RGB(70,70,70)) 
Hl.f=150
CreateLight(0,RGB(255,55,55))
LightLocate(0 , 500, hl, 500)
CreateLight(1,RGB(55,55,255))
LightLocate(1 , 2500, hl, 1500)
CreateLight(2,RGB(255,255,55))
LightLocate(2 , 1500, hl, 1500)

;- Procedures

Procedure SuiviCube()
  ;Calcule les coordonnées des 4 coins du cube
  ;Les entitys permettent de vérifier que le calcul des coins est correct
  ;Distance du centre à chaque coin ( l'objet est carré )
  Protected HauteurEntity.f=16
  Protected LongueurEntity.f=68
  Protected LargeurEntity.f=68  
  Protected DemiLongueurEntity.f=LongueurEntity/2
  Protected DemiLargeurEntity.f=LargeurEntity/2
  
  AvantCentreX.f=M3D_NewXValue(EntityX(#Mobile),Joueur\AngleX,DemiLongueurEntity+16)
  AvantCentreZ.f=M3D_NewZValue(EntityZ(#Mobile),Joueur\AngleX,DemiLongueurEntity+16)
  
  ;Coin Avant Gauche
  AvantGaucheX.f=M3D_NewXValue(AvantCentreX,Joueur\AngleX+90,DemiLargeurEntity)
  AvantGaucheZ.f=M3D_NewZValue(AvantCentreZ,Joueur\AngleX+90,DemiLargeurEntity)
 
  ;Coin Avant Droit
  AvantDroitX.f=M3D_NewXValue(AvantCentreX,Joueur\AngleX-90,DemiLargeurEntity)
  AvantDroitZ.f=M3D_NewZValue(AvantCentreZ,Joueur\AngleX-90,DemiLargeurEntity)
 
  ArriereCentreX.f=M3D_NewXValue(EntityX(#Mobile),Joueur\AngleX+180,DemiLongueurEntity-16)
  ArriereCentreZ.f=M3D_NewZValue(EntityZ(#Mobile),Joueur\AngleX+180,DemiLongueurEntity-16)
  
  ;Coin Arrière Gauche
  ArriereGaucheX.f=M3D_NewXValue(ArriereCentreX,Joueur\AngleX+180-90,DemiLargeurEntity)
  ArriereGaucheZ.f=M3D_NewZValue(ArriereCentreZ,Joueur\AngleX+180-90,DemiLargeurEntity)
  
  ;Coin Arrière Droit
  ArriereDroitX.f=M3D_NewXValue(ArriereCentreX,Joueur\AngleX+180+90,DemiLargeurEntity)
  ArriereDroitZ.f=M3D_NewZValue(ArriereCentreZ,Joueur\AngleX+180+90,DemiLargeurEntity)
  
 
  ;Hauteur des coins
  AvantGaucheH.f=M3D_GetGroundHeight(#Matrix1,AvantGaucheX,AvantGaucheZ) + HauteurEntity
  AvantDroitH.f=M3D_GetGroundHeight(#Matrix1,AvantDroitX,AvantDroitZ) + HauteurEntity
  ArriereGaucheH.f=M3D_GetGroundHeight(#Matrix1,ArriereGaucheX,ArriereGaucheZ) + HauteurEntity
  ArriereDroitH.f=M3D_GetGroundHeight(#Matrix1,ArriereDroitX,ArriereDroitZ) + HauteurEntity
  
  ;écarts Largeur / Longueur devrait permettre de calculer l'angle d'inclinaison !
  Largeur=((AvantGaucheH-AvantDroitH)+(ArriereGaucheH-ArriereDroitH))/2.0
  Longueur=((AvantGaucheH-ArriereGaucheH)+(AvantDroitH-ArriereDroitH))/2.0
 
  ;Corrige la hauteur ( 3 c'est la moitié de l'épaisseur de l'objet)
  HauteurCentre.f=M3D_GetGroundHeight(#Matrix1,EntityX(#Mobile),EntityZ(#Mobile)) + HauteurEntity
  MoyenneHauteur.f=((AvantGaucheH+AvantDroitH+ArriereGaucheH+ArriereDroitH)/4.0) + HauteurEntity
  If MoyenneHauteur>HauteurCentre
    h.f=MoyenneHauteur
  Else
    h.f=HauteurCentre
  EndIf
  EntityLocate(#Mobile,EntityX(#Mobile),h,EntityZ(#Mobile))
  Ay.f=ASin(Largeur/Sqr(LargeurEntity * LargeurEntity+ Largeur*Largeur))*57.29578
  Az.f=ASin(Longueur/Sqr(LongueurEntity * LongueurEntity  + Longueur*Longueur))*57.29578
  RotateEntity(#Mobile,Joueur\AngleX,Ay,Az)
  
  RotateEntity(#RoueAVG,Joueur\AngleX+90,0,90) 
  EntityLocate(#RoueAVG,AvantgaucheX,AvantGaucheH,AvantGaucheZ)
  RotateEntity(#RoueAVD,Joueur\AngleX+90,0,90) 
  EntityLocate(#RoueAVD,AvantDroitX,AvantDroitH,AvantDroitZ)  
  RotateEntity(#RoueARG,Joueur\AngleX+90,0,90) 
  EntityLocate(#RoueARG,  ArriereGaucheX,  ArriereGaucheH,  ArriereGaucheZ)
  RotateEntity(#RoueARD,Joueur\AngleX+90,0,90) 
  EntityLocate(#RoueARD,  ArriereDroitX,  ArriereDroitH,  ArriereDroitZ)  
EndProcedure
Procedure GestionCamera()
  Camera\AngleX = Joueur\AngleX
  PosXCamera.f = M3D_CurveValue(CameraX(0),M3D_NewXValue(EntityX(#Mobile) , Camera\AngleX + 180 , camera\Distance),300)
  PosZCamera.f = M3D_CurveValue(CameraZ(0),M3D_NewZValue(EntityZ(#Mobile) , Camera\AngleX + 180 , camera\Distance),300) 
  hcamera.f=M3D_GetGroundHeight(#Matrix1, PosXCamera, PosZCamera)
  H1.f = EntityY(#Mobile) + camera\Hauteur
  If hcamera> H1 
    H1 = hcamera + 50
  EndIf
  camera\PosY = H1
  CameraLocate(0 , PosXCamera, M3D_CurveValue(CameraY(0),camera\PosY,250), PosZCamera)
  CameraLookAt(0 , EntityX(#Mobile), EntityY(#Mobile)+ Camera\AngleY, EntityZ(#Mobile))      
EndProcedure

;- Boucle Principale

Phl.f=-0.2

Repeat 
ClearScreen(0)
Hl + Phl 
If Hl> 600 Or Hl < -10 
Phl * -1
EndIf
LightLocate(0 , 500, hl, 500)
LightLocate(1 , 2500, hl, 1500)
LightLocate(2 , 1500, hl, 1500)

  
   If ExamineMouse()
     MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
    	MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
     Joueur\AngleX = M3D_WrapValue( Joueur\AngleX + MouseX)
     Camera\AngleY + MouseY
   EndIf  
  If ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Left)
    Joueur\AngleX = M3D_WrapValue( Joueur\AngleX + 3)
	    ;InfosEntity\VitesseDansR3\x + M3D_Cos(Joueur\AngleX+90) * #CameraSpeed/2
	    ;InfosEntity\VitesseDansR3\z - M3D_Sin(Joueur\AngleX+90) * #CameraSpeed/2
    ElseIf KeyboardPushed(#PB_Key_Right)
    Joueur\AngleX = M3D_WrapValue( Joueur\AngleX - 3)
	    ;InfosEntity\VitesseDansR3\x + M3D_Cos(Joueur\AngleX-90) * #CameraSpeed/2
	    ;InfosEntity\VitesseDansR3\z - M3D_Sin(Joueur\AngleX-90) * #CameraSpeed/2
    EndIf
    If KeyboardPushed(#PB_Key_Up)
      InfosEntity\VitesseDansR3\x + M3D_Cos(Joueur\AngleX) * #CameraSpeed/2
    	InfosEntity\VitesseDansR3\z - M3D_Sin(Joueur\AngleX) * #CameraSpeed/2
    ElseIf KeyboardPushed(#PB_Key_Down)
      InfosEntity\VitesseDansR3\x + M3D_Cos(Joueur\AngleX) * -#CameraSpeed/2
    	InfosEntity\VitesseDansR3\z - M3D_Sin(Joueur\AngleX) * -#CameraSpeed/2
    EndIf
  EndIf 

  MoveEntity(#Mobile,InfosEntity\VitesseDansR3\x, 0, InfosEntity\VitesseDansR3\z)
  h.f=M3D_GetGroundHeight(#Matrix1,EntityX(#Mobile),EntityZ(#Mobile)) + 3
  EntityLocate(#Mobile,EntityX(#Mobile), h , EntityZ(#Mobile))
  SuiviCube()
  InfosEntity\VitesseDansR3\x = M3D_CurveValue(InfosEntity\VitesseDansR3\x ,0.0,250)
  InfosEntity\VitesseDansR3\z = M3D_CurveValue(InfosEntity\VitesseDansR3\z ,0.0,250)
  GestionCamera()

  RenderWorld()
  StartDrawing(ScreenOutput())
    DrawText(0,0,Str(Engine3DFrameRate(#PB_Engine3D_Current)))
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
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