Il est possible de soumettre une "FreeCamera" à la gravitation.

Vous activerez la "gravitation" pour la caméra avec les 3 lignes suivantes :


scene.gravity = new BABYLON.Vector3(0, -1, 0);
camera.applyGravity = true;
camera.checkCollisions = true;
			

"scene.gravity" vous permets d'activer la gravité dans votre scène. Le "BABYLON.Vector3" représente le vecteur intensité de la pesanteur , habituellement noté g.

Si la notion de vecteur intensité de pesanteur ne vous est pas familière, sachez que vous devez avoir un "Vector3" avec les coordonnées x et z à 0 et la coordonnée y négative (plus cette coordonnée y sera "négative" et plus votre objet "tombera vite" (physiquement c'est un peu plus complexe, mais cette activité n'est pas un cours de physique), la caméra tombera moins vite avec un "Vector3(0, -1, 0)" qu'avec un "Vector3(0, -3, 0)"). Si vous voulez simuler la gravité terrestre, il faudra avoir "Vector3(0, -9.8, 0)". Évidemment, il est possible de simuler un monde avec des lois physiques complètement différentes, par exemple avec une caméra qui "tombera" à l'horizontale : "Vector3(0, 0, 2)" ou une caméra qui "tombera" vers le haut : "Vector3(0, 2, 0)". Je précise que tout ceci est exact si votre "sol" se trouve dans le plan xOz et que les "y" positifs sont vers le haut.

"camera.applyGravity" : permets d'activer la gravitation pour votre caméra

"camera.checkCollisions" : permets d'activer les collisions pour la caméra (nous aurons l'occasion de revenir sur les collisions un peu plus bas).

À faire vous même 7.1

Créer une nouvelle application app_07

script.js


var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);
var scene = new BABYLON.Scene(engine);
var camera = new BABYLON.FreeCamera("FreeCamera", new BABYLON.Vector3(0, 30, 0), scene);
camera.attachControl(canvas);
var light = new BABYLON.PointLight("pointLumineux1", new BABYLON.Vector3(100, 100, 0), scene);
var plan=BABYLON.Mesh.CreatePlane("sol",200,scene);
plan.rotation.x=Math.PI/2;
var cube=BABYLON.Mesh.CreateBox("boite",5.0,scene)
cube.position.z=40;
cube.position.y=2;
scene.gravity = new BABYLON.Vector3(0, -1, 0);
camera.applyGravity = true;
camera.checkCollisions = true;
engine.runRenderLoop(function () {
 scene.render();
});
			

Étudier et tester cet exemple. Pour que la caméra (FreeCamera) tombe, il faut très légèrement "bouger" (à l'aide des flèches). Vous constatez que vous traversez le sol et que vous poursuivez votre chute "éternellement".


À faire vous même 7.2

Créer une nouvelle application app_08

Reprenez l'exemple précédent (app_07) et ajoutez la prise en charge des collisions pour le sol (votre sol deviendra "consistant")


plan.checkCollisions = true
			

Vous devez également également ajouter les lignes suivantes :


camera.ellipsoid = new BABYLON.Vector3(1, 1, 1)
			

permet de donner un volume à votre caméra (un objet avec un volume égal à zéro (!?) ne peut pas entrer en collision avec un autre objet)


scene.collisionsEnabled = true
			

permet de rendre les collisions actives dans la scène

Tester cette nouvelle application (app_08)

Vérifiez que maintenant vous ne passez plus au travers du sol.


Si maintenant vous vous déplacez sur le sol, vous remarquerez sans doute qu'il vous est possible de traverser le "cube".

À faire vous même 7.3

Modifier l'application app_08 pour que la caméra ne puisse plus passer au travers du cube.

Tester vos modifications