Débuter avec Matter.js le module du corps

Dans le didacticiel précédent de la série, vous avez découvert les modules World et Engine dans Matter.js. Les méthodes disponibles dans ces deux modules sont destinées à contrôler le comportement de plusieurs corps ou du monde entier à la fois. Cependant, à un moment donné, il deviendra nécessaire de contrôler les propriétés des corps individuels dans votre monde.. 

Par exemple, vous pouvez appliquer une force sur un objet particulier ou modifier son coefficient de frottement. Dans ce cas, le module Body de Matter.js peut être d’une grande aide. Ce module contient de nombreuses méthodes et propriétés vous permettant de spécifier des valeurs pour tous les types d'attributs physiques, de la masse au coefficient de restitution. Dans ce tutoriel, vous découvrirez toutes ces méthodes et propriétés et comment les utiliser correctement..

Mise à l'échelle, rotation et translation d'un corps

Vous pouvez faire pivoter n’importe quel corps rigide du monde Matter.js à l’aide des touches rotation (corps, rotation) méthode. La rotation est relative à l'angle actuel du corps et elle ne lui communiquera aucune vitesse angulaire. L'angle de rotation est spécifié en radians.

Vous pouvez également redimensionner un corps en utilisant le scale (corps, scaleX, scaleY, [point]) méthode. Les paramètres scaleX et échelleY spécifiez la quantité de mise à l'échelle dans les directions horizontale et verticale respectivement. N'oubliez pas qu'une telle mise à l'échelle actualisera également les propriétés physiques du corps, telles que sa masse, sa surface et son inertie. Le quatrième paramètre spécifie le point autour duquel se produit la mise à l'échelle. Si non spécifié, la valeur par défaut du point de mise à l'échelle est supposée être le centre du corps.

Il est possible de déplacer un corps d’un vecteur donné par rapport à sa position actuelle en utilisant la traduire (corps, traduction) méthode. Le paramètre translation spécifie la nouvelle position de l'objet par rapport à sa position actuelle. Voici la partie du code de la démo qui met à l'échelle, tourne et déplace la boîte.

var Body = Matter.Body; var box = Bodies.rectangle (460, 120, 40, 40); $ ('. scale'). on ('click', function () Body.scale (box, 1.5, 1.2);); $ ('. rotate'). on ('click', function () Body.rotate (box, Math.PI / 6);); $ ('. translate'). on ('click', function () Body.translate (box, x: -10, y: 20););

Réglage des vitesses et application des forces

Vous pouvez également communiquer une vitesse linéaire à un objet à l'aide du bouton setVelocity (corps, vitesse) méthode. L'application d'une vitesse de cette manière ne change pas l'angle, la force appliquée ou la position de l'objet concerné. La position de l'objet ou son angle vont probablement changer, mais la bibliothèque ne les définit pas spécifiquement à une valeur. Leurs valeurs sont déterminées par d’autres forces agissant sur l’objet, comme le frottement. 

Tout comme la vitesse linéaire, vous pouvez également modifier la vitesse angulaire d’un objet à l’aide des touches setAngularVelocity (corps, vitesse) méthode. Dans ce cas également, la position, l'angle et la force appliqués à l'objet restent inchangés.

Il ne faut pas oublier que la vitesse est un vecteur. setVelocity () et un nombre dans setAngularVelocity ().

$ ('. linear'). on ('click', function () Body.setVelocity (boîte, x: 10, y: -10);); $ ('.angular'). on ('click', function () Body.setAngularVelocity (box, Math.PI / 6););

En plus de transmettre des vitesses à des objets, vous pouvez également leur appliquer un vecteur de force. le applyForce (corps, position, force) méthode peut être utilisée pour appliquer un Obliger vecteur sur un corps d'une donnée position. Cette force peut entraîner ou non l'application d'un couple sur un corps donné. 

Le code suivant applique une force au centre du corps. Le vecteur de force est x: 0, y: -0,05. Cela signifie que la force appliquée sera purement verticale et ascendante. N'oubliez pas que les forces verticales orientées vers le haut ont un signe négatif dans Matter.js. Une autre chose à noter est le petit nombre spécifiant la force verticale. La force de gravitation elle-même n'a qu'une valeur de 1 dans Matter.js.

Le mouvement de la balle après l'application des forces semble naturel tant que cette balle n'entre pas en collision avec les murs ou le sol. Normalement, lorsque les choses se heurtent à quelque chose, nous nous attendons à ce qu'elles rebondissent. L'énergie avec laquelle un objet rebondit est déterminée par le coefficient de restitution. 

Dans Matter.js, sa valeur est définie sur zéro par défaut. Cela signifie que tout objet dont la restitution est définie sur zéro et entre en collision avec quelque chose d'autre ne rebondira pas du tout. Une valeur de 1 signifie que l'objet rebondira avec une énergie cinétique égale à celle qu'il avait avant la collision. Une valeur telle que 0,5 signifie que l'objet ne rebondira qu'avec 50% de son énergie cinétique précédente. La valeur de restitution pour un objet peut être contrôlée à l'aide de la touche restitution clé.

Dans certaines simulations, il peut s'avérer nécessaire de modifier le frottement entre différents corps. Ceci peut être réalisé en utilisant le friction, frictionAir et frictionStatique clés.

  • le friction key spécifie la valeur du frottement cinétique pour un corps. Il peut avoir une valeur comprise entre 0 et 1. Une valeur de 0 signifie qu'un corps peut continuer à se déplacer indéfiniment une fois qu'il a été mis en mouvement. La seule façon de l'arrêter sera d'appliquer une autre force externe. La valeur finale du frottement entre deux objets est déterminée à l'aide de la formule Math.min (bodyA.friction, bodyB.friction)
  • le frictionStatique key spécifie la valeur de la friction lorsqu'un corps est au repos. La valeur par défaut pour le frottement statique est 0.5. Une valeur plus élevée signifie qu'une plus grande force sera nécessaire pour faire bouger le corps.
  • le frictionAir La touche est utilisée pour spécifier la valeur du frottement entre un corps et l'air ambiant. Une valeur plus élevée signifie que le corps ralentira très rapidement lorsqu'il se déplacera dans les airs. L'effet du frottement de l'air est non linéaire.
$ ('. red-friction'). on ('click', function () circleA.friction = 0.05; circleA.frictionAir = 0,0005; circleA.restitution = 0.9;); $ ('. res-friction'). on ('clic', fonction () circleA.friction = 0.1; circleA.frictionAir = 0.001; circleA.restitution = 0;);

Contrôler le rendu des corps

Jusqu'à présent, nous n'avons pas spécifié la couleur, la largeur du contour ni le style de trait à utiliser lors du rendu d'un corps. Toutes ces propriétés sont imbriquées dans le rendre clé. le fillStyle La propriété accepte une chaîne pour spécifier le style de remplissage rendant le corps. le largeur de ligne La propriété accepte un nombre définissant la largeur de ligne à utiliser lors de la création du contour d'un corps.. 

Une valeur de zéro signifie qu'aucune ligne ne sera rendue du tout. le strokeStyle Cette propriété peut être utilisée pour spécifier le style de trait à utiliser lors du rendu du contour du corps. Vous pouvez empêcher le rendu d’un corps en définissant le paramètre visible la clé de faux. L’opacité du corps à rendre peut être contrôlée à l’aide de la touche opacité clé.

Vous pouvez également utiliser une image au lieu de simples couleurs et contours pour restituer un corps. Les paramètres de rendu d'un corps à l'aide d'images-objets sont spécifiés à l'aide d'un ensemble de propriétés différent. le texture propriété définit le chemin de l'image à utiliser comme texture de sprite. 

le xOffset et yOffset Les propriétés peuvent être utilisées pour définir le décalage dans les axes respectifs de l’image-objet. De même, vous pouvez utiliser le xScale et yScale propriétés pour définir la mise à l'échelle des axes x et y pour l'image-objet. Voici du code qui remplace le fond bleu clair de notre ballon par un sprite de football du site Web Open Game Art.

var ball = Bodies.circle (90, 280, 20, render: sprite: texture: "path / to / soccer_ball.png", xScale: 0.4, yScale: 0.4);

Changer les propriétés physiques

Vous avez déjà vu comment spécifier le frottement ou le coefficient de restitution d'un objet dans Matter.js. Il y a beaucoup d'autres propriétés dont les valeurs peuvent être spécifiées de la même manière. D'autre part, il y a des propriétés qui sont en lecture seule et que vous ne pouvez pas modifier.

Vous pouvez définir la position d’un corps dans le monde en utilisant le position clé, qui accepte un vecteur comme valeur. Vous pouvez également spécifier la masse d’un corps à l’aide des touches Masse propriété, mais vous devrez également définir une valeur pour le inverseMass propriété, qui est calculée en utilisant 1 / masse. Une meilleure façon de contrôler la masse d’un corps est d’aider le densité propriété. 

Une fois que vous modifiez la densité d'un corps, sa masse sera calculée automatiquement en fonction de sa surface. De cette façon, vous pouvez également différencier différents objets en fonction de leur densité. Par exemple, un corps qui utilise un rocher comme image-objet doit avoir une densité supérieure à celle d'un corps de la même taille qui utilise un ballon de football comme son image-objet..

Certaines propriétés comme la vitesse, rapidité et vitesse angulaire sont en lecture seule, mais leurs valeurs peuvent être définies à l'aide de méthodes appropriées telles que setAngularVelocity () et setVelocity (). Vous pouvez en savoir plus sur les différentes propriétés du module Body dans la documentation..

Conclusion

Dans ce tutoriel, vous avez découvert toutes les méthodes et propriétés importantes du module Body de la bibliothèque Matter.js. Connaître ces différentes propriétés et leur rôle peut vous aider à créer des simulations plus réalistes de la physique réelle. Dans le prochain et dernier tutoriel de la série, vous découvrirez le module Composite dans Matter.js..

Si vous avez des questions concernant ce tutoriel ou des astuces pour utiliser la bibliothèque, n'hésitez pas à les partager avec nous..