Créer une application Hololens avec UrhoSharp : La physique - Partie 2

Dans le précédent article, nous sommes arrivés à afficher une nouvelle balle toutes les secondes à une position aléatoire. Votre but, si vous l'acceptez, sera d'ajouter des propriétés physiques aux balles comme une masse, une gravité ou gérer les collisions.

Il pleut des balles

La première étape est de définir une masse pour chacune des balles. Si nous ne le faisons pas, le moteur physique ignorera l'object car sa masse sera nulle, ce qui est impossible dans la vraie vie. Dans la méthode CreateBall, vous pouvez ajouter le bout de code ci-dessous qui permet d'ajouter un composent RigidBody afin de régler sa masse à 0.1. Il est important de noter que nous ne créons pas de nouveau noeud pour ajouter ce composant car celui-ci doit s'appliquer sur l'ensemble de l'objet et donc sur le noeud parent.

// Add a rigidbody
var rigidbody = ballNode.CreateComponent<RigidBody>();
rigidbody.Mass = 0.1f;

Vous pouvez utiliser le composant RigidBody2D si votre projet est en 2D. Cela permettra au moteur physique d'être plus rapide car il n'aura pas à gérer le déplacement sur l'axe z et les rotations sur les axes x et y.

 Ca va cogner dur

Pour gérer la collision entre les objets, nous devons ajouter un composant de type CollisionShape qui définira la forme, la taille et la position de la zone de collision. Cela peut être une forme simple comme un cube ou une shpère ou bien une forme plus complexe comme un mesh. Dans notre exemple, nous utiliserons tout simplement une sphère.

// Add a collision shape
var collision = ballNode.CreateComponent<CollisionShape>();
collision.SetSphere(1, Vector3.Zero, Quaternion.Identity);

En terme de performance pure, il est préférable d'utiliser une ou plusieurs formes simples plutôt qu'un mesh qui représente exactement le modèle. Les calculs seront beaucoup plus simples pour le moteur physique et il faut donc bien réfléchir au type de forme à utiliser. Une approximation est souvent utilisée : par exemple, un cube peut être une solution simple pour gérer les collisions avec la tête d'un personnage.

Nos balles peuvent donc gérer les collisions, il ne nous reste plus qu'à ajouter un sol pour les acceuillir.

private void CreateFloor()
{
    var floorNode = Scene.CreateChild();
    floorNode.Position = new Vector3(0, -1, 0);
    floorNode.SetScale(20);

    var floorModelNode = floorNode.CreateChild();
    var plane = floorModelNode.CreateComponent<Urho.Shapes.Plane>();
    plane.Color = Color.White;

    var rigidbody = floorNode.CreateComponent<RigidBody>();
    rigidbody.Kinematic = true;

    var collision = floorNode.CreateComponent<CollisionShape>();
    collision.SetBox(new Vector3(20, 0.1f, 20), new Vector3(0, -0.05f, 0), Quaternion.Identity);
}

 Cette méthode ressemble fortement à CreateBall sauf qu'elle utilise la propriété Kinematic du composant RigidBody. Grâce à cette propriété, le moteur physique ne va pas appliquer la gravité à cet objet, ce qui convient parfaitement pour un sol. N'oubliez pas de lancer la création du sol dans la méthode Start.

protected override void Start()
{
    base.Start();

    CreateFloor();
}

Dans le prochain épisode, nous utiliserons la technique du spatial mapping afin de détecter notre sol automatiquement.

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus