Le Blog

  • : Le blog de Romain Dedenis
  • : Un blog relatif à la programmation web, vous trouverez ici des tutoriels sur différents langages tel que le flash, le php... Ainsi que différentes astuces et articles. Bonne visite :)
  • Contact

Contacts

viadeo-icone-5757-48.png linkedin.png

Liens Utiles

 

Documentation Flash as 3.0 :

Flash as 3.0

 

Documentation moteurs 3D Flashs :


Documentation Utilitaires 3D Flashs :

Et bien sûr, le fil RSS du Blog ! rss

30 janvier 2011 7 30 /01 /janvier /2011 01:35

Comme promis, voici notre nouveau tutoriel, nous allons voir comment texturer les faces de notre cube avec des images et comment interagir avec chaque face pour créer un menu 3d par exemple.


7.1
I/ Texturer et intéragir avec les faces d'un cube.


Pour cet exemple, nous allons reprendre le premier tutoriel auquel nous allons apporter quelques modifications pour texturer nos faces avec des images et associer une action au clique sur une face.

 

Code Source

 

 

package {
    import flash.display.Sprite;
    import alternativa.engine3d.containers.ConflictContainer;
    import alternativa.engine3d.core.Camera3D;
    import alternativa.engine3d.core.View;
    import alternativa.engine3d.primitives.Box;
    //Ajout
    import flash.display.Loader;
    import flash.events.Event;
    import flash.net.URLRequest;
    import alternativa.engine3d.materials.TextureMaterial;
    import alternativa.engine3d.core.MouseEvent3D;
    import alternativa.engine3d.core.RayIntersectionData;
    import alternativa.engine3d.materials.FillMaterial;
    import flash.net.navigateToURL;
  
    public class Main extends Sprite{
        private var scene:ConflictContainer = new ConflictContainer();
        private var camera:Camera3D;
        private var cube:Box;
      
        public function Main(){
            camera = new Camera3D();
            camera.view = new View(550, 400);
            addChild(camera.view);
            addChild(camera.diagram);
           
            camera.rotationX = -1.8;
            camera.rotationZ = -1.4
            camera.x = -300;
            camera.y = -50;
            camera.z = 100;

            scene.addChild(camera);
           
            //Ajout chargement de l'image de texture
            loadBitmap();
        }
       
        private function loadBitmap():void{
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, createCube);
            loader.load(new URLRequest("test.png"));
        }
       
        private function createCube(e:Event):void{
            //On créer une texture par face (5 textures couleurs et 1 image)
            // Texture couleurs
            var red:FillMaterial = new FillMaterial(0xFF0000); 
            red.name = "red"; 
            var blue:FillMaterial = new FillMaterial(0x0000FF); 
            blue.name = "blue"; 
            var green:FillMaterial = new FillMaterial(0x00FF00); 
            green.name = "green"; 
            var yellow:FillMaterial = new FillMaterial(0xFFFF00); 
            yellow.name = "yellow"; 
            var black:FillMaterial = new FillMaterial(0x000000); 
            black.name = "black";
           
            // Texture image
            var bmp:TextureMaterial = new TextureMaterial(e.currentTarget.content.bitmapData);
            bmp.name = "Bitmap";
           
            // Création du cube et affectation des textures aux faces
            cube = new Box(120, 300, 120, 1, 1, 1, false, false, bmp, blue, green, yellow, black, red);
            scene.addChild(cube);
           
            // Ajout de l'écouteur d'événements Click sur le cube
            cube.addEventListener(MouseEvent3D.CLICK, faceClick);
           
            // Ajout du rafraichissement automatique de la caméra
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
       
        private function faceClick(e:MouseEvent3D):void{
            // On récupère l'objet sous le curseur de la souris et appartenant au cube, en gros on récupère la face cliquée
            var data:RayIntersectionData = cube.intersectRay(e.localOrigin, e.localDirection);
            if(data != null){
                // Ici, nous récupérons le nom de la face
                var faceName:String = data.face.material.name;
               
                if(faceName == "Bitmap"){
                    navigateToURL(new URLRequest("http://romaindedenis.over-blog.com"), "_blank");
                } else {
                    //Si le nom de la face est différent de "Bitmap", on change sa couleur
                    data.face.material = new FillMaterial(Math.random() * 0xffffff);
                    data.face.material.name = faceName;
                }
            }
        }
       
        private function onEnterFrame(e:Event):void{
            //On faist tourner le cube de 0.01 radians par frame
            cube.rotationZ += 0.01;
            camera.render();
        }
    }
} 

 

Résultat Obtenu 

 
 
Voilà pour ce tutoriel, nous verrons la prochaine fois dans un tutoriel un peu plus rapide comment intégrer des flux vidéos sur les faces de notre cube tout aussi simplement que des textures.


Ce tutoriel vous a été utile? rss Abonnez-vous au fil RSS !



  Romain Dedenis.

 


Partager cet article
Repost0

commentaires

S
<br /> Bonjour Romain! j'ai fortement apprécié les différents tutoriaux que tu as mis en ligne. Ils sont d'une grande clarté, merci encore pour ce travail remarquable !<br /> <br /> <br /> Je cherche une solution me permettant d'importer un objet 3D texturé (issu de 3DSMax) et de pouvoir l'animé.<br /> <br /> <br /> Mon idée était de combiner le tuto avec les interactions souris et celui du lampion...<br /> <br /> <br /> L'objet 3DSMax risque d'être assez lourd (je pourrai probablement demander de réduire les détails pour en alléger le poids)<br /> <br /> <br /> Peut-on avec Alternativa3D répondre à mon besoin.<br /> <br /> <br /> Sachant que le projet en question utilise les technos PHP/XML/JS/CSS/PNGMASK/HTML5 et FLASH ;) probablement un peu de vidéo<br /> <br /> <br /> Gros projet, comme on peut imaginer...<br /> <br /> <br /> Je serai intéressé de pouvoir échanger avec toi sur nos savoir faire respectifs.<br /> <br /> <br /> Merci encore pour les solutions claire que tu exposes<br /> <br /> <br /> Bien à toi<br /> <br /> <br /> SB<br />
Répondre
R
<br /> <br /> Bonjour Sébastien!<br /> <br /> <br /> Merci pour les compliments :). Tu peux bien évidement utiliser Alternativa3D pour ton projet. Tu peux affecter des écouteurs de la souri sur tes objets 3D, après je suppose que tu veux cibler des<br /> zones précises de ton objets qui entraineront des actions différentes?<br /> <br /> <br /> Pour ce faire, (je vais parler théorique car je ne maitrise pas la modélisation 3D) tu peux avec 3DSmax faire des groupements de Mesh auxquels tu affectes un nom et pour pouvoir les récupérer<br /> dans ton moteur 3D. Donc ensuite, tu affectes à chaque partie de ton objet 3D l'écouteur correspondant et le tour est joué :).<br /> <br /> <br /> Je te conseille aussi d'alléger le poids pour le chargement, mais tu pourras encore gagner un peu de poids en zippant ton objet et en le dézippant à l'éxécution du Flash.<br /> <br /> <br /> <br />
V
<br /> <br /> Ha super, Merci.<br /> <br /> <br /> <br />
Répondre
V
<br /> <br /> Merci de me répondre<br /> <br /> <br /> Oui merci j'avais tester ça aussi pour changer directement la texture lorsqu'on clique sur la face du cube.<br /> <br /> <br /> Le problème c'est que maitenant (et c'est ce que j'essaye de faire) je ne clique plus sur la face d'un cube mais sur un objet extérieur au cube principal pour lui changer sa texture .<br /> <br /> <br /> A la manière d'un album photo, en cliquant sur une fleche extérieur on change la photo de la visionneuse<br /> <br /> <br /> <br />
Répondre
R
<br /> <br /> Oki, alors pour accèder aux faces du cube directement, tu t'y prends comme suit :<br /> <br /> <br />  <br /> <br /> <br /> cube.faces[0].material = new TextureMaterial(ton_BitmapData); <br /> <br /> <br /> ...<br /> <br /> <br /> cube.faces[6].material = new TextureMaterial(ton_BitmapData); <br /> <br /> <br /> <br />
V
<br /> <br /> Bonjour, très bon tutorial.<br /> <br /> <br /> Je l'ai suivi à la lettre et j'ai appris beaucoup de choses.<br /> <br /> <br /> J'aimerai maintenant aller plus loin en changeant de texture(.jpg) d'une face du cube en cliquant sur un autre cube ou sphere.<br /> <br /> <br /> C'est possible ? as-tu une piste ?<br /> <br /> <br /> <br />
Répondre
R
<br /> <br /> Salut viking,<br /> <br /> <br /> pour ce faire, je remplacerai simplement cette ligne :<br /> <br /> <br /> data.face.material = new FillMaterial(Math.random() * 0xffffff);<br /> <br /> <br /> par quelquechose du genre :<br /> <br /> <br /> data.face.material = new TextureMaterial(ton_bitmapData);<br /> <br /> <br />  <br /> <br /> <br />  <br /> <br /> <br /> <br />