Collision et Gravité

Généralités sur la programmation 3D
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Collision et Gravité

Message par microdevweb »

@Falsam, je penses également que créer un jeux seul s'avère être une opération quasi impossible.

Faire le modelling,riging,animation de personnages ainsi que les décores et codé tout cela. Chapeau à celui qui y arive
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Collision et Gravité

Message par venom »

Joli rendu en tout cas. Bravo






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Re: Collision et Gravité

Message par Guillot »

je me suis pas trop attardé sur ton code, mais il me semble que tu pourrai faire plus simple pour les particules :
tu crées l’émetteur une fois pour toute, et tu l'active/desactive suivant tes besoins avec
DisableParticleEmitter

pour ce qui est de la gravité : l'unité est le m.s -2, donc elle dépend de l'unité de longueur
autrement dit, si tu veux avoir une force de gravité réaliste avec tes entités, tu dois te soucier de leur taille
l'unité de longueur du moteur 3d est le mètre, donc sinbad doit faire environ 2m de haut pour chutter de façon réaliste
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Collision et Gravité

Message par Ollivier »

Pour la valeur de gravité terrestre, quand on chute, on gagne chaque seconde 35,32 kilomètre par heure si l'atmosphère n'existait pas.

avec v, la vitesse et a l'accélération, on a :

1) Hypothèse:
v = 35,32 km.h{-1} (kilomètre/heure)

2) Conversion en mètres/seconde (m/s ou m.s{-1} )
v = 9,81 m.s{-1}

3) Vitesse gagnée par seconde (accélération)
a = 9,81 m.s{-1}.s{-1}

4) Simplification
a = 9,81 m.s{-2} (se lit "mètre par seconde au carré")

D'où le "-2" indiqué par Guillot, que je salue au passage depuis la planète Gibi.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Collision et Gravité

Message par falsam »

Guillot a écrit :je me suis pas trop attardé sur ton code, mais il me semble que tu pourrai faire plus simple pour les particules :
tu crées l’émetteur une fois pour toute, et tu l'active/desactive suivant tes besoins avec
DisableParticleEmitter
Non pas dans cet exemple car je fais une traînée de 10 particules.

Si Sinbad s’arrête de courir, je libère les particules du dernier émetteur au premier émetteur.
Guillot a écrit :donc sinbad doit faire environ 2m de haut pour chutter de façon réaliste
La taille de Sinbad est de 6 unités. Si tu le mets en situation avec la mer. la surface ondulante est démesuré.

Cet exemple met Sinbad en situation. J'ai ajouté une variable Scale afin de redimensionner la scène à l’échelle souhaitée.

■ Sinbad de base fait 6 unités et la mer ne peut pas être redimensionnée.

La variable Scale se trouve à la ligne 10 initialisée à 1.

Fais le test sans rien touché puis initialise la variable Scale à 15 puis 33.

Code : Tout sélectionner

EnableExplicit

;Police
Global FontInfo = LoadFont(-1, "Arial", 12)

;Textures
Global MatGround, MatBox, MatBuoy  

;Entities
Global Scale = 1

Global Camera, CameraHeight = 2, Player, PlayerSpeed, CurrentAnimation.s, Angle = 180, Distance = 10 
Global Ground

;Sprite  
Global Bottom

;Init engine
If Not (InitEngine3D() And InitSprite() And InitKeyboard())
  End
EndIf

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_BorderLess | #PB_Window_Maximize)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0))

;The elements are in the examples folder of PureBasic
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/waterworld.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/Sinbad.zip", #PB_3DArchive_Zip)
Parse3DScripts()

KeyboardMode(#PB_Keyboard_International | #PB_Keyboard_AllowSystemKeys)
EnableWorldPhysics(#True) 
EnableWorldCollisions(#True)
WorldGravity(-10)

;-[2D] Create ou load sprite
Bottom = CreateSprite(-1, ScreenWidth(), 150, #PB_Sprite_AlphaBlending)

;-[3D] Create ou load 3D element

;-Textures & material
MatGround  = CreateMaterial(-1, TextureID(LoadTexture(-1, "Floor02.jpg")))        ;Ground
ScaleMaterial(MatGround, 0.5, 0.5)
MatBox     = CreateMaterial(-1, TextureID(LoadTexture(-1, "Caisse.png")))         ;Box

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

;Sky and fog
SkyBox("desert07.jpg")

;-Light and shadow
CreateLight(0, RGB(255, 255, 255), -100 * Scale, 500 * Scale, 100 * Scale)
;WorldShadows(#PB_Shadow_Additive) ;Fontionne pas 
WorldShadows(#PB_Shadow_TextureModulative)

;-Sea
Sun(0, 10000, 10000, RGB(255, 255, 255))
CreateWater(Camera, 0, 0, 0, 0, #PB_World_WaterSmooth | #PB_World_WaterSun | #PB_World_WaterFoam)

;-Ground
Ground = CreateEntity(-1, MeshID(CreateCube(-1, 1)), MaterialID(MatGround), 0, 1, 0)
ScaleEntity(Ground, 100 * Scale, 2 * Scale, 100 * Scale)
CreateEntityBody(Ground, #PB_Entity_StaticBody)

;-Player
Player = CreateEntity(-1, MeshID(LoadMesh(#PB_Any, "sinbad.mesh")), #PB_Material_None, 0, 7 * Scale/2, 0)
ScaleEntity(Player, Scale, Scale, Scale)
CreateEntityBody(Player, #PB_Entity_ConvexHullBody, 1, 1, 1)
EntityAngularFactor(Player, 0, 1, 0) 

Repeat
  ;-
  ;-[3D] Rendering
  If ExamineKeyboard()
        
    ;-keyboard events : Distance and move
    If KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Up)
      Distance - 5
    ElseIf KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Down)  
      Distance + 5
    ElseIf KeyboardPushed (#PB_Key_Up)
      PlayerSpeed = 10 * Scale
      CurrentAnimation = "RunBase"
      Angle = 180
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed = -10 *Scale
      Angle = 0
      CurrentAnimation = "RunBase"
    Else
      CurrentAnimation = "IdleTop"
      PlayerSpeed = 0
    EndIf
        
    ;-keyboard events : Rotation around player and turn
    If KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Left)
      Angle - 5
    ElseIf KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Right)
      Angle + 5 
    ElseIf KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 3, 0, #PB_Relative)
      CurrentAnimation = "RunBase"
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -3, 0, #PB_Relative)
      CurrentAnimation = "RunBase"
    EndIf   
    
    ;Escape
    If KeyboardReleased(#PB_Key_Escape)
      Break
    EndIf      
  EndIf
  
  DisableEntityBody(Player, #False) ; Wake up entity (BugWare)
  MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)      
  
  ;Play animation
  If EntityAnimationStatus(Player, CurrentAnimation) = #PB_EntityAnimation_Stopped 
    StartEntityAnimation(Player, CurrentAnimation)
  EndIf
     
  CameraFollow(Camera, EntityID(Player), Angle, EntityY(Player) + CameraHeight * Scale, Distance * Scale, 0.25, 1, #True)
  
  RenderWorld(50)
  
  ;-[2D] Rendering
  StartDrawing(SpriteOutput(Bottom))
  DrawingFont(FontID(FontInfo))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0, 0, ScreenWidth(), SpriteWidth(Bottom), RGBA(0, 0, 0, 110))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10, 10, ". : : Help : : .")
  DrawText(10, 40, "Arrow keys - Move player.")
  DrawText(10, 70, "Ctrl + Up / Ctrl + Down  - Distance between camera and player.")
  DrawText(10, 100, "Ctrl + Left ou Ctrl + Right - Turn around the player.")
  StopDrawing()
  DisplayTransparentSprite(Bottom, 0, ScreenHeight() - SpriteHeight(Bottom))
  
  FlipBuffers()
Until WaitWindowEvent(1) = #PB_Event_CloseWindow
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Collision et Gravité

Message par Ollivier »

@Falsam

Si le perso fait hPhys = 2 mètres comme suggéré par Guillot.
Si le perso fait hVirt = 6 unités, comme tu l'indiques.
Un scale primaire Scale1 peut être calculé.

Scale1 = hVirt / hPhys
Scale1 = 6 / 2

Sans pouvoir tester de suite, vu tes explications, tu testes "à tâtons" les proportions réalistes Perso/Vague. Et je ne pense pas qu'il y ait d'autres solutions.

Tu obtiens donc un scale secondaire Scale2 obtenu à tâtons.

Le résultat de la déformation (scale) usuelle est :
Scale0 = Scale1 * Scale2

Je vois que tu utilises 10 au lieu de 9.81 (c'est 3/4 km/h d'erreur cumulée chaque seconde de chute)
g = -9.81 * Scale0

ou approximativement

g = -10 * Scale0

Avec :

Code : Tout sélectionner

WorldGravity(g)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Collision et Gravité

Message par falsam »

Ollivier a écrit :Sans pouvoir tester de suite, vu tes explications, tu testes "à tâtons" les proportions réalistes Perso/Vague.
testes et tu pourras constater.
Ollivier a écrit :g = -10 * Scale0
Dans ce code ça n'avait pas d'importance mais dans un autre (non publié ici) c'est évident qu'il faut que je multiplie la gravité par scale. Merci pour ce rappel.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Collision et Gravité

Message par Ollivier »

@Falsam

Je tâcherai d'apporter un message de retour dès que je pourrai tester. Ça commence à faire un sacré paquet de contributions de différents auteurs à tester... (sur deux ans environ !)
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Re: Collision et Gravité

Message par Guillot »

salut falsam

j'ai modifié la gestion des particules de ton code

IMPORTANT :

1) pour que le fader fonctionne correctement il faut specifier
DisableMaterialLighting(MatSmoke, 1)

2) dans CreateParticleEmitter les parametres 'height' et 'depth' son inversés

la 3d contient beaucoup d'erreurs et d’imprécisions qui rendent son apprentissage penible
faudrai qu'un jour on se decide a faire un correctif complet
perso, j'avais commencé une liste, mais j'ai jamais pris le temps de faire les choses sérieusement ...



Code : Tout sélectionner

;[PB 5.60 Minimum]

EnableExplicit

;Font
Global FontInfo = LoadFont(-1, "Arial", 12)

;Material
Global MatGround, MatBox, MatSmoke  

;Entities
Global Camera, Player, PlayerSpeed, CurrentAnimation.s, Angle = 0, Distance = 200, Action 
Global Ground, Box

;Dust emiter / Emetteur de poussieres
Global NewList Emiters()

;Sprite  
Global Bottom

;Init engine
If Not (InitEngine3D() And InitSprite() And InitKeyboard())
  End
EndIf

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_BorderLess | #PB_Window_Maximize)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0))

;The elements are in the examples folder of PureBasic
Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home +"Examples/3D/Data/Packs/Sinbad.zip", #PB_3DArchive_Zip)
Parse3DScripts()

KeyboardMode(#PB_Keyboard_International | #PB_Keyboard_AllowSystemKeys)
EnableWorldPhysics(#True) 

;-[2D] Create ou load sprite (Help)
Bottom = CreateSprite(-1, ScreenWidth(), 150, #PB_Sprite_AlphaBlending)

;-[3D] Create ou load 3D element

;-Textures
MatGround  = CreateMaterial(-1, TextureID(LoadTexture(-1, "Dirt.jpg")))   ;Ground material
MatBox     = CreateMaterial(-1, TextureID(LoadTexture(-1, "Caisse.png"))) ;Box materiel
MatSmoke   = CreateMaterial(-1, TextureID(LoadTexture(-1, "smoke.png")))  ;Particule materiel
MaterialBlendingMode(MatSmoke, #PB_Material_AlphaBlend)
DisableMaterialLighting(MatSmoke, 1)
;-Camera
Camera = CreateCamera(-1, 0, 0, 100, 100)

;-Sky and fog
SkyBox("desert07.jpg", RGB(255, 255, 255), 1, 900, 6000)
Fog(RGB(255, 255, 255), 1, 100, 1000)

;-Light and shadow
CreateLight(0, RGB(255, 255, 255), -100, 500, 100)
WorldShadows(#PB_Shadow_Additive)

;-Ground
Ground = CreateEntity(-1, MeshID(CreatePlane(-1, 1500, 1500, 1, 1, 20, 20)), MaterialID(MatGround))
CreateEntityBody(Ground, #PB_Entity_StaticBody)


;-Box
Box = CreateEntity(-1, MeshID(CreateCube(-1, 20)), MaterialID(MatBox), 0, 15, 0)
CreateEntityBody(Box, #PB_Entity_BoxBody, 1, 1, 1)

;-Player
Player = CreateEntity(-1, MeshID(LoadMesh(#PB_Any, "sinbad.mesh")), #PB_Material_None, 10, 40, -40)
ScaleEntity(Player, 5, 5, 5)
CreateEntityBody(Player, #PB_Entity_ConvexHullBody, 1, 3, 20)
EntityAngularFactor(Player, 0, 1, 0)
RotateEntity(Player, 0, -120, 0)

;- Dust emiter / Emetteur de poussiére
CreateParticleEmitter(0, 10, 10,0, #PB_Particle_Box)
ParticleMaterial(0, MaterialID(MatSmoke))
ParticleSize(0, 20, 20)
ParticleEmissionRate(0, 20)
ParticleEmitterDirection(0,0,1,0)
ParticleVelocity(0, #PB_Particle_Velocity, 20)
ParticleTimeToLive(0, 1, 1)
ParticleColorFader(0,0,0,0,-1)

Repeat
  ;-
  ;-[3D] Rendering
  If ExamineKeyboard()
    
    ;-Test collision 
    Debug  "EntityCollide(Ground, Player) " + Str(EntityCollide(Ground, Player))
    
    ;-keyboard events : Distance and move
    If KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Up)
      Distance - 5
    ElseIf KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Down)  
      Distance + 5
    ElseIf KeyboardPushed (#PB_Key_Up)
      PlayerSpeed = 50
      CurrentAnimation = "RunBase"
      Angle = 180
      Action = #True
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed = -50
      Angle = 0
      CurrentAnimation = "RunBase"
      Action = #True
    Else
      CurrentAnimation = "IdleTop"
      PlayerSpeed = 0
      Action = #False
    EndIf
    
    ;-keyboard events : Rotation around player and turn
    If KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Left)
      Angle - 5
    ElseIf KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Right)
      Angle + 5
    ElseIf KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 3, 0, #PB_Relative)
      CurrentAnimation = "RunBase"
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -3, 0, #PB_Relative)
      CurrentAnimation = "RunBase"
    EndIf
    
    If KeyboardReleased(#PB_Key_Escape)
      Break
    EndIf      
  EndIf
    
  If Action 
    DisableEntityBody(Player, #False) ; Wake up entity (BugWare) 
    
    ;Move player to new position
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
    
  EndIf   
  
  ;Play animation
  If EntityAnimationStatus(Player, CurrentAnimation) = #PB_EntityAnimation_Stopped 
    StartEntityAnimation(Player, CurrentAnimation)
  EndIf
  
  ;End of dust if the player does not move or not in contact with the ground
  MoveParticleEmitter(0,EntityX(Player), 0 ,EntityZ(Player),#PB_Absolute)
  DisableParticleEmitter(0,Bool(action=0))  
  
  
  CameraFollow(Camera, EntityID(Player), Angle, EntityY(Player) + 20, Distance, 0.05, 1, #True)
  
  RenderWorld(50)
  
  ;-
  ;-[2D] Rendering
  StartDrawing(SpriteOutput(Bottom))
  DrawingFont(FontID(FontInfo))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0, 0, ScreenWidth(), SpriteWidth(Bottom), RGBA(0, 0, 0, 110))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10, 10, ". : : Help : : .")
  DrawText(10, 40, "Arrow keys - Move player.")
  DrawText(10, 70, "Ctrl + Up / Ctrl + Down  - Distance between camera and player.")
  DrawText(10, 100, "Ctrl + Left ou Ctrl + Right - Turn around the player.")
  StopDrawing()
  DisplayTransparentSprite(Bottom, 0, ScreenHeight() - SpriteHeight(Bottom))
  
  FlipBuffers()
Until WaitWindowEvent(1) = #PB_Event_CloseWindow
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Collision et Gravité

Message par falsam »

Effectivement c'était stupide ma façon de faire !! Pourquoi n'ai je pas créer l’émetteur de particules avant la boucle événementielle ? j'ai cherché compliqué quand on peut faire simple. Merci pour ce correctif. En plus l'effet est bien plus joli.

Le code du premier message est corrigé.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Collision et Gravité

Message par SPH »

falsam a écrit :le code du premier message est corrigé.
Invalid memory access ligne 127 :

Code : Tout sélectionner

  RenderWorld(50)
peut etre parce que je n'ai pas installé dx9 ? :|
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Collision et Gravité

Message par falsam »

Dans les options de compilation, ajoute OpenGl à la ligne Librairie sous systeme et teste de nouveau.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Collision et Gravité

Message par SPH »

Ton code marche sur mon I7 mais pas sur mon portable neuf w10... :oops:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Collision et Gravité

Message par comtois »

Guillot a écrit : 2) dans CreateParticleEmitter les parametres 'height' et 'depth' son inversés
je viens de jeter un oeil, je ne vois pas d'erreur, chaque paramètre me semble correctement affecté, c'est quoi le problème exactement ?

Code : Tout sélectionner

(emitter)->setWidth (width);
(emitter)->setHeight(height);
(emitter)->setDepth (Depth);
Sinon sympa cet effet de fumée.


[EDIT]
Si c'est inversé, c'est au niveau de wrapper de Fred, dans ce cas faut faire un rapport de bug.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Re: Collision et Gravité

Message par Guillot »

teste la commande, tu verras
ouai, ça doit juste être une inversion de parametre (height avec width ou depth)
les bugs et les imprécisions de la doc, y'en a tellement en 3d que je voulais faire une liste complete plutot que d'y aller au cas par cas
faudra que je trouve le temps un de ces 4...
Répondre