Mon cube chute au ralenti

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Mon cube chute au ralenti

Message par falsam »

Bonjour, j'ai voulu posé un nouvel épisode de "Histoire d'un Cube (Initiation à la 3D)" mais j'ai un souci dans le code.

Je voulais aborder les collisions dans ce code qui permet de piloter un cube et de pousser les autres cubes dans le vide. Mais quand le cube que je pilote tombe lui même dans le vide, il chute au ralenti.

Code : Tout sélectionner

;Naissance d'un cube : l'accident (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

InitEngine3D()
InitKeyboard()
InitSprite()
Parse3DScripts()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; 
; Une texture qui servira pour le cube ainsi que les obstacles et le sol
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

;
; Le materiel qui servira pour le cube ainsi que les obstacles et le sol
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Création du sol 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -2, 0)
EntityPhysicBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

; 
; Creation du cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1) 
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, -1.5, 0)
EntityPhysicBody(Cube_Entity, #PB_Entity_BoxBody, 1,2,0)

;
; Création des obstacles
Obstacle_Mesh = CreateCube(#PB_Any, 1.5) 

For N=1 To 5
  Obstacle_Entity = CreateEntity(#PB_Any, MeshID(Obstacle_Mesh), MaterialID(Material), Random(5), Random(10), Random(5))
  EntityPhysicBody(Obstacle_Entity, #PB_Entity_BoxBody, 1,0,1)
Next

EntityPhysicBody(Obstacle_Entity, #PB_Entity_BoxBody, 1,0,0)

;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))

While #True
  
  Event = WindowEvent()
    
  If ExamineKeyboard()  
  
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf  
  
    If KeyboardPushed(#PB_Key_Left)
      X=-1  
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=1
    Else 
      X=0
    EndIf
  
    If KeyboardPushed(#PB_Key_Up)
      Z=-1  
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=1
    Else
      Z=0
    EndIf
  EndIf

  MoveEntity(Cube_Entity, X,Y,Z, #PB_Local)
  MoveCamera(Camera, 2, 1 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
  
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend 
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%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Mon cube chute au ralenti

Message par G-Rom »

RenderWorld = un paramètre de temps , tu peu jouer avec, n'oublie pas qu'une unité fait 1 mètre , essaye de jouer avec des unité un petit peu plus petite.

Code : Tout sélectionner

;Naissance d'un cube : l'accident (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

InitEngine3D()
InitKeyboard()
InitSprite()
Parse3DScripts()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

WorldGravity(-9.8)

; 
; Une texture qui servira pour le cube ainsi que les obstacles et le sol
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

;
; Le materiel qui servira pour le cube ainsi que les obstacles et le sol
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Création du sol 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -2, 0)
EntityPhysicBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

; 
; Creation du cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1) 
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, -1.5, 0)
EntityPhysicBody(Cube_Entity, #PB_Entity_BoxBody, 1,2,0)

;
; Création des obstacles
Obstacle_Mesh = CreateCube(#PB_Any, 1.5) 

For N=1 To 5
  Obstacle_Entity = CreateEntity(#PB_Any, MeshID(Obstacle_Mesh), MaterialID(Material), Random(5), Random(10), Random(5))
  EntityPhysicBody(Obstacle_Entity, #PB_Entity_BoxBody, 1,0,1)
Next

EntityPhysicBody(Obstacle_Entity, #PB_Entity_BoxBody, 1,0,0)

;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))
frameStop.i = 0

While #True
  frameStart.i = ElapsedMilliseconds()
  Event = WindowEvent()
    
  If ExamineKeyboard()  
  
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf  
  
    If KeyboardPushed(#PB_Key_Left)
      X=-1  
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=1
    Else 
      X=0
    EndIf
  
    If KeyboardPushed(#PB_Key_Up)
      Z=-1  
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=1
    Else
      Z=0
    EndIf
  EndIf

  MoveEntity(Cube_Entity, X,Y,Z, #PB_Local)
  MoveCamera(Camera, 2, 1 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
  
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(frameStop*2)
  FlipBuffers()
  
  frameStop = ElapsedMilliseconds() - frameStart
Wend
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Mon cube chute au ralenti

Message par falsam »

Merci G-Rom de te pencher sur ce code mais le problème est le même. Le cube que je contrôle pour pousser les autres ne tombent pas à la même vitesse que les autres.
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%
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Mon cube chute au ralenti

Message par kelebrindae »

C'est à cause du "MoveEntity(Cube_Entity, X,Y,Z, #PB_Local)".

Quand X, Y, et Z sont à zéro, tu dis à ton cube "Pas bouger!" à chaque itération => l'accélération verticale due à la gravité ne peut pas s'accumuler, et l'objet tombe à vitesse constante...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Mon cube chute au ralenti

Message par falsam »

kelebrindae a écrit :C'est à cause du "MoveEntity(Cube_Entity, X,Y,Z, #PB_Local)".

Quand X, Y, et Z sont à zéro, tu dis à ton cube "Pas bouger!" à chaque itération => l'accélération verticale due à la gravité ne peut pas s'accumuler, et l'objet tombe à vitesse constante...
Merci kelebrindae. j'ai tenté de trouver une parade pour que MoveEntity() ne s'exécute que si il y a eu déplacement mais parfois le déplacement est bloqué ou alors quand meme ralenti.
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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Mon cube chute au ralenti

Message par falsam »

Halalala ce code ne me plait pas encore ! La prise en compte du Physic ne fonctionne pas corectement quand le Cube que je pilote est à cheval sur le bord de la plateform. Et j'ai parfois le cube ne se déplace plus ou alors il ralenti.

Pour résumé ...... je ne suis pas au point sur les collisions

Code : Tout sélectionner

;Naissance d'un cube : l'accident (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

InitEngine3D()
InitKeyboard()
InitSprite()
Parse3DScripts()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; 
; Une texture qui servira pour le cube ainsi que les obstacles et le sol
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

;
; Le materiel qui servira pour le cube ainsi que les obstacles et le sol
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Création du sol 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -2, 0)
EntityPhysicBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

; 
; Creation du cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1) 
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, -1.5, 0)
EntityPhysicBody(Cube_Entity, #PB_Entity_BoxBody, 10,2,2)

;
; Création des obstacles
Obstacle_Mesh = CreateCube(#PB_Any, 1.5) 

For N=1 To 5
  Obstacle_Entity = CreateEntity(#PB_Any, MeshID(Obstacle_Mesh), MaterialID(Material), Random(5), Random(10), Random(5))
  EntityPhysicBody(Obstacle_Entity, #PB_Entity_BoxBody, 1,0,1)
Next

;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))

While #True
  Event = WindowEvent()
  
  EntityMove=#False
  
  If ExamineKeyboard()  
  
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf  
    
    EntityMove=#False 
    
    If KeyboardPushed(#PB_Key_Left)
      X=-2  : EntityMove=#True
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=2 : EntityMove=#True
    Else 
      X=0
    EndIf
  
    If KeyboardPushed(#PB_Key_Up)
      Z=-2 : EntityMove=#True  
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=2 : EntityMove=#True
    Else
      Z=0
    EndIf
  EndIf
  
  If EntityMove = #True
    MoveEntity(Cube_Entity, X,Y,Z, #PB_Local)
  EndIf
  
  MoveCamera(Camera, 2, 1 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
   
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
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%
Répondre