Déplacer une entité physique

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 :

Déplacer une entité physique

Message par falsam »

Deux questions
J'ai un souci avec le déplacement d'une entité (player) qui de temps en temps bascule.
:?: Quel serait la bonne méthode pour éviter que mon entité bascule ?

:?: Comment faire aussi pour que mon entité sache monter un escalier par exemple, sans pour cela utiliser une touche pour effectuer une impulsion verticale.

Le code initiale étant trop long. Je poste un code minimaliste dans lequel le player est représenté par un cylindre. Le player ayant tendance à s'endormir j'ai ajouté un

Code : Tout sélectionner

DisableEntityBody(Player, #False)
pour le réveiller.

Code de test.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration 

Global Speed.f

InitEngine3D() : InitKeyboard() : InitSprite() : InitMouse()

OpenWindow(#Mainform,0,0, 1024, 768, "", #PB_Window_TitleBar)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
Add3DArchive(#PB_Compiler_Home + "\Examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

;Light & Shadow
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -5, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;Camera
CreateCamera(0, 0, 0,100,100)
CameraBackColor(0, RGB(145, 182, 201))
MoveCamera(0, 0, 5, 10, #PB_Absolute)  
CameraLookAt(0, 0,0,0)   

;Ground
Ground = CreateEntity(-1, MeshID(CreatePlane(-1, 20, 20, 1, 1, 10, 10)), #PB_Material_None)
EntityPhysicBody(Ground, #PB_Entity_StaticBody)

;Escalier
For n = 1 To 5
  Entity = CreateEntity(-1, MeshID(CreateCube(-1, 1)), #PB_Material_None, 3+n, n/10, -3)
  ScaleEntity(Entity, 1, 0.2, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next

;Player
Player = CreateEntity(-1, MeshID(CreateCylinder(-1, 0.2, 2)), #PB_Material_None, 0, 1.5, 0)
EntityPhysicBody(Player, #PB_Entity_CylinderBody, 1, 0.1, 0.1)

Repeat
  Repeat : Until WindowEvent() = 0
          
  If ExamineKeyboard()
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
    
    If KeyboardPushed (#PB_Key_Up)
      Speed = -1
    ElseIf KeyboardPushed (#PB_Key_Down)
      Speed = 1
    Else
      Speed = 0
    EndIf
    
    If KeyboardPushed (#PB_Key_Right)
      Rotate = -1
    ElseIf KeyboardPushed (#PB_Key_Left)
      Rotate = 1
    Else
      Rotate = 0
    EndIf
  EndIf
  
  If Speed <> 0 Or Rotate <> 0
    DisableEntityBody(Player, #False) ;Workaround 
    
    RotateEntity(Player, 0, Rotate, 0, #PB_Relative)
    MoveEntity(Player, 0, 0, Speed, #PB_Absolute|#PB_Local)
  EndIf 
  
  CameraFollow(Camera, EntityID(Player), 0, 3, 3, 0.1, 0.1)
  
  RenderWorld(30)
  FlipBuffers()  
ForEver
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: Déplacer une entité physique

Message par falsam »

Merci à celui qui m'a soufflé la réponse pour empêcher le player de basculer. Il faut utiliser la fonction EntityAngularFactor()

J'ai modifié le code. Le player (Toujours matérialisé par un cylindre) peut maintenant monter les escaliers.

J'ai utilisé la fonction RayPick() pour gérer les collisions avec les autres entités. Si le player tombe de l'escalier, j'interdis la fonction MoveEntity() afin qu'il évite de marcher dans le vide.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration 

Global Speed.f

InitEngine3D() : InitKeyboard() : InitSprite() : InitMouse()

OpenWindow(#Mainform,0,0, 1024, 768, "", #PB_Window_TitleBar)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
Add3DArchive(#PB_Compiler_Home + "\Examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

;Light & Shadow
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -5, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;Camera
CreateCamera(0, 0, 0,100,100)
CameraBackColor(0, RGB(145, 182, 201))
MoveCamera(0, 0, 5, 10, #PB_Absolute)  
CameraLookAt(0, 0,0,0)   

;Ground - Sol
Ground = CreateEntity(-1, MeshID(CreatePlane(-1, 20, 20, 1, 1, 10, 10)), #PB_Material_None)
EntityPhysicBody(Ground, #PB_Entity_StaticBody)

;Stairway - Escalier
For n = 1 To 10
  Entity = CreateEntity(-1, MeshID(CreateCube(-1, 1)), #PB_Material_None, 10-n, (n/10) - 0.2, -3)
  ScaleEntity(Entity, 1, 0.1, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next
For n = 10 To 1 Step -1
  Entity = CreateEntity(-1, MeshID(CreateCube(-1, 1)), #PB_Material_None, 0, (n/10) - 0.2, 8-n)
  ScaleEntity(Entity, 1, 0.1, 1)
  EntityPhysicBody(Entity, #PB_Entity_StaticBody)
Next

;Player
Player = CreateEntity(-1, MeshID(CreateCylinder(-1, 0.2, 2)), #PB_Material_None, 9, 1.5, 0)
EntityPhysicBody(Player, #PB_Entity_SphereBody , 1, 0.1, 0.1)
EntityAngularFactor(Player, 0, 0, 0)

Repeat
  Repeat : Until WindowEvent() = 0
          
  If ExamineKeyboard()
    ;End Of Game
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
    
    ;Player Move
    If KeyboardPushed (#PB_Key_Up)
      Speed = -1.5
    ElseIf KeyboardPushed (#PB_Key_Down)
      Speed = 1.5
    Else
      Speed = 0
    EndIf
    
    ;Player Rotate
    If KeyboardPushed (#PB_Key_Right)
      Rotate = -1
    ElseIf KeyboardPushed (#PB_Key_Left)
      Rotate = 1
    Else
      Rotate = 0
    EndIf
  EndIf
  
  ;Collision avec une autre entité (Method Raypick)
  Collide = RayPick(EntityX(Player), EntityY(Player)-1.05, EntityZ(Player),
                   EntityX(Player), 0, EntityZ(Player))
  
  If (Speed <> 0 Or Rotate <> 0) And Collide <> -1
    DisableEntityBody(Player, #False) ;Workaround 
    
    RotateEntity(Player, 0, Rotate, 0, #PB_Relative)
    MoveEntity(Player, 0, 0, Speed, #PB_Absolute|#PB_Local)
  EndIf 
  
  CameraFollow(Camera, EntityID(Player), 0, 3, 5, 0.1, 0.1)
  
  RenderWorld(30)
  FlipBuffers()  
ForEver
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
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Déplacer une entité physique

Message par Kwai chang caine »

Marche niquel sur XP et 5.31
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Déplacer une entité physique

Message par falsam »

@Kwai chang caine: Pas folichon ma démo hein ? Je ne savais pas que tu t'amusais toi aussi avec la 3D. Une ouvre à nous montrer ?
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
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Déplacer une entité physique

Message par Kwai chang caine »

Non j'y connais rien, comme dans tous les graphismes :oops:
Mais j'aime bien essayer les codes 3D, comme tous les autres me diras tu, mais particulierement ceux la, je trouve ça super impressionant ce que vous arrivez à faire avec au final peu de lignes 8O
Certes me diras tu à nouveau, encore faut il trouver les bonnes :mrgreen:
C'est l'avis d'un "newbite"...mais je la trouve cool ta colonne :wink: peut être un peu raide...mais cool 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre