Blog Papervision3D

Blog Français sur Papervision3D

Interactive DisplayObject3D.

Posté par Ocelyn le 16 septembre, 2009
Publié dans Tutoriaux

Je me suis retrouvé récemment confronté à un problème au travail, comment rendre un DisplayObject3D interactif.

Mon DisplayObject3D peut contenir X planes, X cubes, X Sphere… et je souhaiterais écouter les évènements Mouse Over, Mouse Out, Mouse Down… la première solution consisterait à écouter tous ces évènements sur chaque objets présents dans mon Do3d, mais ça reste une solution lourde, et si je passe d’un objet à un autre le premier objet va afficher un Mouse Out… Cette solution reste donc relativement bancale.

Il faut aussi savoir que ce ne sont pas les objets qui sont interactif mais leur textures en activant la propriété interactive à true, à partir de là, on se rend compte qu’il est impossible d’écouter des évènements sur un DisplayObject3D dans son ensemble.

Pour gérer ce problème, la solution est d’utiliser un ViewportLayer, ce dernier comme son nom l’indique est un calque de notre Viewport, dans lequel nous allons stocker notre DisplayObject3D.

Pour ce faire nous créons simplement un nouveau ViewportLayer (ligne 41), dans lequel nous passons notre Do3d.

Il ne nous reste plus qu’à ajouter des écouteurs (ligne 43 et 44), le ViewportLayer nous offre aussi la possibilité de changer l’alpha de tout nos objets, ou d’ajouter un curseur au survol en lui ajoutant un buttonMode (ligne 45), ou encore ajouter un filtre, un mode de fusion…

Enfin si nous souhaitons atteindre le DisplayObject3D contenu dans notre ViewportLayer, nous ferons tout simplement :

MonViewportLayer.displayObject3D pour par exemple lancer un Tween ou autre au Roll over ou autre (ligne 53 et 61).

  1. package {
  2.  
  3. import org.papervision3d.events.InteractiveScene3DEvent;
  4. import org.papervision3d.materials.ColorMaterial;
  5. import org.papervision3d.objects.DisplayObject3D;
  6. import org.papervision3d.objects.primitives.Plane;
  7. import org.papervision3d.view.BasicView;
  8. import org.papervision3d.view.layer.ViewportLayer;
  9.  
  10. import flash.events.Event;
  11. import flash.events.MouseEvent;
  12.  
  13. public class BasicScene extends BasicView{
  14.  
  15. public function BasicScene()
  16. {
  17. buildPlane();
  18. viewport.interactive = true;
  19. startRendering();
  20. }
  21.  
  22. private function buildPlane() : void
  23. {
  24. do3d = new DisplayObject3D("myObject");
  25.  
  26. var colorMaterialFront : ColorMaterial = new ColorMaterial(0xff00ff);
  27. var planeFront : Plane = new Plane(colorMaterialFront, 50, 50, 4, 4);
  28. do3d.addChild(planeFront);
  29. planeFront.z = 1;
  30. planeFront.x = 48;
  31.  
  32. var colorMaterialBack : ColorMaterial = new ColorMaterial(0x00ff00);
  33. var planeBack : Plane = new Plane(colorMaterialBack, 50, 50, 4, 4);
  34. do3d.addChild(planeBack);
  35.  
  36. scene.addChild(do3d);
  37.  
  38. do3d.z = ( camera.zoom * camera.focus )Math.abs(camera.z);
  39. do3d.x = 90;
  40.  
  41. var vp : ViewportLayer = viewport.getChildLayer(do3d, true);
  42.  
  43. vp.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleOver);
  44. vp.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleOut);
  45. vp.buttonMode = true;
  46.  
  47. }
  48.  
  49. private function handleOut(event : MouseEvent) : void
  50. {
  51.  
  52. trace("out");
  53. ViewportLayer(event.currentTarget).displayObject3D.z -= 5;
  54.  
  55. }
  56.  
  57. private function handleOver(event : MouseEvent) : void
  58. {
  59.  
  60. trace("over");
  61. ViewportLayer(event.currentTarget).displayObject3D.z += 5;
  62.  
  63. }
  64.  
  65. override protected function onRenderTick(event:Event=null):void
  66. {
  67. super.onRenderTick(event);
  68. }
  69.  
  70. private var do3d : DisplayObject3D;
  71. }
  72. }
Share and Enjoy:
  • Facebook
  • Twitter
  • LinkedIn
  • del.icio.us
  • Technorati
  • Digg
  • Netvibes
  • Wikio FR
  • Live
  • Google Bookmarks
  • email
  • Print

7 commentaires dans ce post, pour l'instant.

Suivre ce post par RSS ou poser un trackback
mygif
388. coucoulenn dit,
9 octobre, 2009 à 0:25

Hello,

Merci pour tes tutos mais j’ai un pti problème, j’espère que tu peux m’aider !!!

ce code la pas de problème :
vp.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleOver)

même code avec object_release ou click ou press :

vp.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleOver);

et là rien ça ne fonctionne pas je n’arrive pas à tracer un retour, tu as une idée, le over et le out pas de problème.

Merci

mygif
395. grunam dit,
12 octobre, 2009 à 11:03

1119: Accès à la propriété z peut-être non définie, via la référence de type static org.papervision3d.view.layer:ViewportLayer.

J’ai fait un copier-collé et poutant j’ai cette erreur…

Au fait « startRendering(); » appelé à la ligne 19 n’est pas défini.

mygif
396. grunam dit,
12 octobre, 2009 à 11:07

J’ai trouvé,tu as écrit à la ligne 61:
ViewportLayer(event.currentTarget).z += 5;
au lieu de:
ViewportLayer(event.currentTarget).displayObject3D.z += 5;

(cf ligne 53)

mygif
397. grunam dit,
12 octobre, 2009 à 11:26

« Au fait « startRendering(); » appelé à la ligne 19 n’est pas défini. »

Autant pour moi:
« startRendering(); » est nécessaire pour afficher
le rendu.

mygif
398. Ocelyn dit,
13 octobre, 2009 à 15:53

Merci pour m’avoir remonté cette faute d’inattention, c’est corrigé :)

mygif
436. grunam dit,
16 novembre, 2009 à 16:28

Même problème que coucoulenn, merci pour ta réponse:

« vp.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleOver);

et là rien ça ne fonctionne pas je n’arrive pas à tracer un retour, tu as une idée, le over et le out pas de problème. »

mygif
462. Romuhica dit,
22 mars, 2010 à 17:04

Salut à tous et surtout salut à toi Ocelyn.

Tout d’abord, comme tout ceux qui t’ont lu et apprécié ton travail, je te remercie pour ces sources d’informations et de formation que tu proposes. Aborder la 3d interactive pour le web dans ces conditions, c’est du régale.

Maintenant, j’ai une question à te soumettre.

Je développe un site où le menu est une carte du monde divisée en 6 parties. Tous les effets que je souhaite fonctionnent (Roll-Over, Out, clic). Chacun de ces 6 parties est indépendante, et c’est là que je bloc. J’aimerai alléger mon code et n’avoir qu’un displayObjectContainer3D qui gère les parties, de leur interactivité à leur animation. Connais tu le prototype du displayObjectContainer3D et s’il est judicieux de l’utiliser dans ce cas ?

Merci par avance.

Laisser un commentaire

Currently browsing Interactive DisplayObject3D.

 Pseudo(*requis)

 Email (*privée)

 Site internet (*optionnel)