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