EntityPhysicBody()

Syntaxe

EntityPhysicBody(#Entity, Type [, Masse [, Restitution, Friction]])
Description
Crée ou change le type de corps (body) associé à une entité.

Arguments

#Entity L'entité à utiliser.
Type Le 'Type' définit comment le moteur physique gère l'entité:
  #PB_Entity_None       : Aucun body associé à l'entity (mode par défaut).
  #PB_Entity_StaticBody : Le body est statique, c'est à dire que le mesh ne peut pas être animé.
                          Ce mode permet des collisions très précises, car elles sont faites par rapport aux triangles
                          qui compose le mesh (connu comme la tri-mesh collision). Les collisions entre body static et les autres types de body
                          (sphere, box etc.) sont très rapides, mais entre deux body static, cela devient très lent.
                          C'est le type de body parfait pour utiliser une mesh comme un sol ou pour un monde statique.
  #PB_Entity_BoxBody    : Une boîte 'virtuelle' englobant totalement l'entity (avec les mêmes dimensions)
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_SphereBody : Une sphère 'virtuelle' englobant totalement l'entity
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_CylinderBody : Un cylindre 'virtuel' englobant totalement l'entity
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_CapsuleBody : Une capsule 'virtuelle' englobant totalement l'entity
                          est utilisée pour gérer les collisions entre les autres entités.
  #PB_Entity_ConvexHullBody : Une forme complexe 'virtuelle' déduite du mesh réel gère les collisions contre les autres
                          entités. Ce mode est plus lent que le mode basic de collision.
Masse (optionnel) Masse de l'objet.

Ne pas utiliser une valeur trop grande car il pourrait se produire des incohérences physiques (Préférer la valeur 1).

Restitution (optionnel) Coefficient de Restitution de la vitesse de l'objet suite à une collision (Rebond).

En théorie, ce coefficient est égal à la vitesse restituée, divisée par la vitesse initiale. Il est aussi égal à la racine carrée de la hauteur du rebond, divisée par la hauteur du lâché.

Il est généralement compris entre 0 et 1 mais s'il est supérieur à 1 ou inférieur à 0, la collision produit de l'énergie cinétique et donc de la vitesse (vitesse restituée > vitesse initiale).

Cette valeur peut également être obtenue ou définie via GetEntityAttribute() et SetEntityAttribute()

Friction (optionnel) Force de friction ou de frottement de l'objet.

Attention ce paramètre est proportionnel à la Masse.

Cette valeur peut également être obtenue ou définie via GetEntityAttribute() et SetEntityAttribute()

Valeur de retour

Aucune.

Remarques

Pour que les collisions soient gérées par le moteur physique, une entité doit avoir un corps.

De plus, le moteur physique doit être activé à l'aide de la commande EnableWorldPhysics().

En fait, seul le corps est connu du moteur physique lequel fera tous les calculs concernant l'entité, vérifiera sa masse, les forces de frottements (friction) et s'il entre en collision, cela entraînera un mouvement de recul de l'entité (Restitution).

Exemple

 ;- initialisation
InitEngine3D()
InitSprite()
InitKeyboard()


 ;- Fenêtre
OpenWindow(0, 0, 0, 800, 500, "Billard. (Touche Echap pour quitter)", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800,500, 0, 0, 0,#PB_Screen_SmartSynchronization)

 ;- Textures
txTable = CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txTable))
Box(0, 0, 256, 256, $008000)
StopDrawing()

txBordure= CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txBordure))
Box(0, 0, 256, 256, $000080)
StopDrawing()

txBalle =CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txBalle))
Box(0, 0, 256, 256, $0000FF)
StopDrawing()

 ;- Matériaux
mtTable = CreateMaterial(#PB_Any,TextureID(txTable))
mtBordure = CreateMaterial(#PB_Any,TextureID(txBordure))
mtBalle = CreateMaterial(#PB_Any,TextureID(txBalle))


 ;- Entities

 ; Table
dimX = 50:dimY = 25
bordureHeight.f = 2:bordureWidth.f = 1
planeMesh = CreatePlane(#PB_Any,dimX,dimY,1,1,1,1)
sol  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(mtTable),0,0.2,0)
EntityPhysicBody(sol, #PB_Entity_StaticBody,999,0,0.2)

 ; Bordures
cubeMesh = CreateCube(#PB_Any,1)
 ;Nord
bordure1 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure1,dimX,bordureHeight,bordureWidth)
EntityLocate(bordure1,0,bordureHeight / 2,-(dimY / 2 + bordureWidth / 2))
EntityPhysicBody(bordure1, #PB_Entity_StaticBody,999,1,0)
 ;Sud
bordure2 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure2,dimX,bordureHeight,bordureWidth)
EntityLocate(bordure2,0,bordureHeight / 2,(dimY / 2 + bordureWidth / 2))
EntityPhysicBody(bordure2, #PB_Entity_StaticBody,999,1,0)
 ;Ouest 
bordure3 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure3,bordureWidth,bordureHeight,dimY)
EntityLocate(bordure3,-(dimX / 2 + bordureWidth / 2),bordureHeight / 2,0)
EntityPhysicBody(bordure3, #PB_Entity_StaticBody,999,1,0)
 ;Est
bordure4 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtBordure))
ScaleEntity(bordure4,bordureWidth,bordureHeight,dimY)
EntityLocate(bordure4,(dimX / 2 + bordureWidth / 2),bordureHeight / 2,0)
EntityPhysicBody(bordure4, #PB_Entity_StaticBody,999,1,0)

 ; Bille
billeMesh =CreateSphere(#PB_Any, 1); Sphère
 ;billeMesh = CreateCylinder(#PB_Any,1,0.3) ; Un Palet à la place d'une bille

bille = CreateEntity(#PB_Any,MeshID(billeMesh),MaterialID(mtBalle))
EntityLocate(bille,-dimx/2 + 3,2,0)
 ; Masse de 0.5 : Coefficient de restitution de 0.2 : Force de friction de 0
EntityPhysicBody(bille,#PB_Entity_CylinderBody,0.5,0.2,0)
 ;.==========================================.
 ;| Essayez différentes valeurs de la Masse, | 
 ;| du coefficient de restitution            |
 ;| et de la force de friction               |
 ;'=========================================='

 ;- Caméra
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,15,dimY)
CameraBackColor(0,$808000) ; Couleur de fond

 ;-Lumière & Ombre
AmbientColor($333333)
CreateLight(0,$FFFFFF,200,400,200)
WorldShadows(#PB_Shadow_Additive)

 ;- Go !
wireframe.b = #False
impulse.f = 10
timer = ElapsedMilliseconds() - 3000

KeyboardMode(#PB_Keyboard_International)
Repeat
  Delay(1)
  While WindowEvent() : Wend
  
  ExamineKeyboard()
  
  ; Suivre la bille du regard
  CameraLookAt(0,EntityX(bille),EntityY(bille),EntityZ(bille))
  
  ; Applique une impulsion à la bille toutes les 5 secondes pour la mettre en mouvement
  If ElapsedMilliseconds() - timer >= 5000
    ApplyEntityImpulse(bille,impulse,0,0)
    impulse = -impulse
    timer = ElapsedMilliseconds()
  EndIf
  
  ; Rendu
  RenderWorld()
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape)

End

Voir aussi

EntityAngularFactor(), EntityCollide(), EntityCustomParameter(), EntityLinearFactor(), GetEntityAttribute(), GetEntityMaterial(), SetEntityAttribute(), SetEntityMaterial()

OS Supportés

Tous

<- EntityParentNode() - Entity Index - EntityPitch() ->