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).
-
package {
-
-
import org.papervision3d.events.InteractiveScene3DEvent;
-
import org.papervision3d.materials.ColorMaterial;
-
import org.papervision3d.objects.DisplayObject3D;
-
import org.papervision3d.objects.primitives.Plane;
-
import org.papervision3d.view.BasicView;
-
import org.papervision3d.view.layer.ViewportLayer;
-
-
import flash.events.Event;
-
import flash.events.MouseEvent;
-
-
public class BasicScene extends BasicView{
-
-
public function BasicScene()
-
{
-
buildPlane();
-
viewport.interactive = true;
-
startRendering();
-
}
-
-
private function buildPlane() : void
-
{
-
do3d = new DisplayObject3D("myObject");
-
-
var colorMaterialFront : ColorMaterial = new ColorMaterial(0xff00ff);
-
var planeFront : Plane = new Plane(colorMaterialFront, 50, 50, 4, 4);
-
do3d.addChild(planeFront);
-
planeFront.z = 1;
-
planeFront.x = 48;
-
-
var colorMaterialBack : ColorMaterial = new ColorMaterial(0x00ff00);
-
var planeBack : Plane = new Plane(colorMaterialBack, 50, 50, 4, 4);
-
do3d.addChild(planeBack);
-
-
scene.addChild(do3d);
-
-
do3d.z = ( camera.zoom * camera.focus ) – Math.abs(camera.z);
-
do3d.x = 90;
-
-
var vp : ViewportLayer = viewport.getChildLayer(do3d, true);
-
-
vp.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleOver);
-
vp.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleOut);
-
vp.buttonMode = true;
-
-
}
-
-
private function handleOut(event : MouseEvent) : void
-
{
-
-
trace("out");
-
ViewportLayer(event.currentTarget).displayObject3D.z -= 5;
-
-
}
-
-
private function handleOver(event : MouseEvent) : void
-
{
-
-
trace("over");
-
ViewportLayer(event.currentTarget).displayObject3D.z += 5;
-
-
}
-
-
override protected function onRenderTick(event:Event=null):void
-
{
-
super.onRenderTick(event);
-
}
-
-
private var do3d : DisplayObject3D;
-
}
-
}





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