Papervision3D et moteur physique

Lors du développement d’une application 3D il est souvent intéressant d’ajouter des notions de physique, comme la gravité, les collisions, rebonds...

Il existe principalement deux moteurs de physique 3D pour Flash : Jiglib et WowEngine. Je vais expliquer dans cet article l’utilisation de WowEngine.

Voici comment il s’utilise dans une application, couplé avec PaperVision3D :

L’animation dispose, de façon bien distincte, du moteur de rendu et du moteur de physique. Ils sont entièrement indépendants. Le site du projet WowEngine présente un exemple très clair pour comprendre comment coupler les deux, regardons un peu le code (fournit ici) :

public function createOneSphere(x:int,y:int,z:int,radius:int): void
{
 //we create a physics sphere the param is position x,y,z the radius, if it's fixed or not and the mass
 var wowSphere:WSphere = new WSphere(x,y,z,radius,false,0.1);
 wowSphere.elasticity=0.5;
 wowSphere.friction=0.02;
 wow.addParticle(wowSphere);
 
 //and the 3dObject on the 3d renderer starting by the material...
 var material:WireframeMaterial=new WireframeMaterial(0,100,.1)
 //...and the 3DObject
 var sphere:Sphere = new Sphere(material , radius, 5, 3 );
 sphere.x=-wowSphere.px;
 sphere.y=-wowSphere.py;
 sphere.z=-wowSphere.pz;
 scene.addChild(sphere);
 //
 sphereArray.push({physics:wowSphere,render:sphere});
}
private function enterFrameHandler( event : Event ):void 
{
 //we update the physics engine
 wow.step()
 
 // we link the  physics sphere to the rendered sphere
 var ballCount:int=sphereArray.length;
 while(ballCount--){
  var physics:WSphere=sphereArray[ballCount].physics
  var render:Sphere=sphereArray[ballCount].render
  render.x=physics.px;
  render.y=-physics.py;
  //trace(physics.py)
  render.z=physics.pz;
 }
 //we update the 3d view
 renderer.renderScene(scene,camera, viewport);
} 

Après avoir initialisé Papervision et WowEngine (respectivement dans les méthodes "setupPapervision()" et "setupWow()"), cette méthode permet de créer une sphère dans l’environnement 3D réagissant aux lois de gravitation.

Le principe est le suivant :

D’une part, on crée, dans le moteur physique, une WSphere qui sera soumise à différentes contraintes comme l’élasticité (capacité de rebondir), les frictions (en plus de la gravité). D’autre part, on crée dans le moteur de rendu, une Sphere simple.

La liaison entre les deux est faite dans la méthode "enterFrameHandler" : on peut voir qu’elle met à jour la position de l’objet graphique (Sphere) selon la position de l’objet physique (WSphere).

La mise en place d’un moteur physique dans un projet 3D n’est donc pas plus compliqué que cela : il suffit de créer les deux moteurs indépendamment et de mettre périodiquement à jour le rendu en fonction de l’évolution des données physiques.


Fichier(s) joint(s) :