Page 1 sur 1

Mon cube chute au ralenti

Publié : dim. 30/juin/2013 11:11
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 

Re: Mon cube chute au ralenti

Publié : dim. 30/juin/2013 12:00
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

Re: Mon cube chute au ralenti

Publié : dim. 30/juin/2013 14:42
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.

Re: Mon cube chute au ralenti

Publié : lun. 01/juil./2013 9:09
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...

Re: Mon cube chute au ralenti

Publié : lun. 01/juil./2013 10:07
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.

Re: Mon cube chute au ralenti

Publié : lun. 01/juil./2013 10:12
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