Comunidad de diseño web y desarrollo en internet online

Problema con un cubo. Novato busca solución, jeje.

Citar            
MensajeEscrito el 03 Sep 2011 10:43 pm
Hola muy buenas gentes. ¿Qué tal? Vengo con un problema hipergeneralizado que casitodo el mundo sabe resolver, y digo casi todo el mundo pues yo no tengo ni idea, jeje. El caso es que hice una función que crea un ortoedro en 3 dimensiones. Dicho ortoedro se puede girar y demas. El método para la creación del mismo se basa en figuras planas rectangulares que encierran al ortoedro con 6 caras planas. El caso es que cuando el ortoedro se gira, se transparenta todo el fondo del mismo, y esto no quiero que pase, querría que mi ortoedro fuera sólido. ¿Alguien sabe la solución? Muchas gracias gentes :D.

Por cierto, pongo el código que uso para dicho experimento:

Código ActionScript :

stop();
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.MovieClip;
var n:Number=new Number();
var e:Sprite=new Sprite();
var i:Array=[new int()];
var s:Array=["frontal","izquierda","derecha","arriba","abajo","atras"];
//   u(ancho,alto,largo);
function u(t0:Number,t1:Number,t2:Number,t3:Array){
   //   trace(e);
   e=new Sprite();
   addChild(e);
   //   c=[frontal,izquierda,derecha,arriba,abajo,atrás];
   //   c[x]=[[width,height],[x,y,z],[rotationX,rotationY,rotationZ]];
   var c:Array=[[[t0,t1],[0,0,0],[0,0,0]],[[t2,t1],[t0,0,t2],[0,90,0]],[[t2,t1],[0,0,t2],[0,90,0]],[[t0,t2],[0,0,0],[90,0,0]],[[t0,t2],[0,t1,0],[90,0,0]],[[t0,t1],[0,0,t2],[0,0,0]]];
   for(var i:int=0;i<6;i++){
      this[s[i]]=new MovieClip();
      var m:MovieClip=this[s[i]];
      //   trace(m);
      if(t3.length==1){
         n=0;
      }else{
         n=i;
      };
      if(t3[n][0]==0){
         m.graphics.beginFill(t3[n][1]);
      };
      m.graphics.drawRect(0,0,c[i][0][0],c[i][0][1]);
      m.graphics.endFill();
      m.x=c[i][1][0];
      m.y=c[i][1][1];
      m.z=c[i][1][2];
      m.rotationX=c[i][2][0];
      m.rotationY=c[i][2][1];
      m.rotationZ=c[i][2][2];
      m.blendMode=BlendMode.LAYER;
      e.addChild(m);
      //   trace(e.getChildAt(i));
   };
};
u(50,20,100,[[0,"0x000088"],[0,"0x000077"],[0,"0x000066"],[0,"0x000055"],[0,"0x000044"],[0,"0x000033"]]);
var e1:Sprite=new Sprite();
e1=e;
e1.x=150;
e1.y=150;
var u0=function(){
   e1.rotationY+=10;
};
addEventListener(Event.ENTER_FRAME,u0);

Por miglug

Claber

113 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 05 Sep 2011 02:12 pm
Vengo con un problema hipergeneralizado que casitodo el mundo sabe resolver ... hice una función que crea un ortoedro en 3 dimensiones


¿Es un chiste o falta de modestia mal disimulada? Muy poca gente se pone a hacer geometría a mano, especialmente con la existencia de bibliotecas especializadas. Anyway esta bien tu ejemplo, tiene unos cuantos errores de concepto que indican que vienes de otro lenguaje o de la matemática, te dejo la clase mas "AS friendly"

Código ActionScript :

package test
{
   import flash.display.BlendMode;
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.display.Graphics; 
      
   /**
    * Lo que sabe todo el mundo: dibujar y rotar un octaedro
    */
   public class Octaedro extends Sprite 
   {
      private var e:Sprite;
      
      public function Octaedro():void 
      {
         if (stage) init();
         else addEventListener(Event.ADDED_TO_STAGE, init);
      }
      //Crea el contenedor, inicia el dibujo, inicia la rotación
      private function init():void {                           
            e = new Sprite(); 
            e.x=150; 
            e.y = 150; 
            addChild(e); 
            render(50,20,100,[[0,"0x000088"],[0,"0x000077"],[0,"0x000066"],[0,"0x000055"],[0,"0x000044"],[0,"0x000033"]]);
            addEventListener(Event.ENTER_FRAME, rotate);
      }
      //dibuja las caras
      private function render(t0:Number,t1:Number,t2:Number,t3:Array):void{          
         //   c=[frontal,izquierda,derecha,arriba,abajo,atrás]; 
         //   c[x]=[[width,height],[x,y,z],[rotationX,rotationY,rotationZ]]; 
         var c:Array = [[[t0, t1], [0, 0, 0], [0, 0, 0]], [[t2, t1], [t0, 0, t2], [0, 90, 0]], [[t2, t1], [0, 0, t2], [0, 90, 0]], [[t0, t2], [0, 0, 0], [90, 0, 0]], [[t0, t2], [0, t1, 0], [90, 0, 0]], [[t0, t1], [0, 0, t2], [0, 0, 0]]]; 
         var n:Number; 
         var s:Array = []
         for(var i:int=0;i<6;i++){ 
           s.push(new MovieClip());    
           var m:MovieClip=s[i]; 
           n = (t3.length == 1)?0:1;
           if(t3[n][0]==0){ 
             m.graphics.beginFill(t3[n][1]); 
           }; 
           m.graphics.drawRect(0,0,c[i][0][0],c[i][0][1]); 
           m.graphics.endFill(); 
           m.x=c[i][1][0]; 
           m.y=c[i][1][1]; 
           m.z=c[i][1][2]; 
           m.rotationX=c[i][2][0]; 
           m.rotationY=c[i][2][1]; 
           m.rotationZ=c[i][2][2]; 
           m.blendMode=BlendMode.LAYER
           e.addChild(m);             
         }; 
      }; 
      //rota el contenedor
      private function rotate(evt:Event):void{ 
         e.rotationY+=10; 
      }; 
   }   
}


Uso:

addChild(new Octaedro())

No lo veo transparente, lo veo bien, igual si juegas con el BlendMode obtienes efectos interesantes

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Sep 2011 10:40 am
¡Buenas solisarg! ¿Qué tal? Tu siempre salvando mis dudas, jeje. Muchas gracias por responderme. Bueno, ante todo muchas gracias por el esfuerzo y dedicación, pero no funciona, sigue pasando lo mismo que en mi código. La cosa es que en tu script se muestra sin las diversas tonalidad expuestas en t3:Array;, pero si se las exponemos, dichas tonalidades muestran como las superficies del cubo se superponen las unas a las otras haciendo de éste un cubo semitransparente cambiando simplemente el valor de n; igual a i;.

El problema que planteo se resuelve con un comando llamado setChildIndex();, sé como funciona y es sencillo, pero a la hora de exponerlo a moviemientos tridimensionales con elementos 3D no sé ni como meterlo, sin embargo, con elemento bidimensionales en un espacio 3D está tirado, funciona tal que el modo swapDepth(); de AS2, no igual, pues no intercambia relativamente un valor de profundidad, entonces, llego a la conclusión de que AS3 no usa realmente estructuras 3D, pues el eje Z es mera información para la emulación 3D, pero quien representa un fondo real es setChildIndex();.

Sé que hay ejemplos en internet que son una pasada, mostrando el resultado que quiero con un código sumamente sencillo, pero que sin embargo, no logro comprender, tales como el siguiente link:

http://www.kirupa.com/developer/actionscript/3dindex.htm

Pero la forma más sencilla de entenderlo y empezar a funcionar con la tercera dimensión de AS3 es la que expongo, creo yo. De todas maneras, muchas gracias por todo y en cuanto descubra el modo de hacerlo os lo expongo, y también iré siguiendo el hilo por nuevas hipótesis y pruebas :D.

Por cierto, dejo el código que me enviaste corregido:

Código ActionScript :

package test 
{ 
   import flash.display.BlendMode; 
   import flash.display.MovieClip; 
   import flash.display.Sprite; 
   import flash.events.Event; 
   import flash.display.Graphics;  
       
   /** 
    * Lo que sabe todo el mundo: dibujar y rotar un octaedro 
    */ 
   public class Octaedro extends Sprite  
   { 
      private var e:Sprite; 
       
      public function Octaedro():void  
      { 
         if (stage) init(); 
         else addEventListener(Event.ADDED_TO_STAGE, init); 
      } 
      //Crea el contenedor, inicia el dibujo, inicia la rotación 
      private function init():void {                            
            e = new Sprite();  
            e.x=150;  
            e.y = 150;  
            addChild(e);  
            render(50,20,100,[[0,"0x000088"],[0,"0x000077"],[0,"0x000066"],[0,"0x000055"],[0,"0x000044"],[0,"0x000033"]]); 
            addEventListener(Event.ENTER_FRAME, rotate); 
      } 
      //dibuja las caras 
      private function render(t0:Number,t1:Number,t2:Number,t3:Array):void{           
         //   c=[frontal,izquierda,derecha,arriba,abajo,atrás];  
         //   c[x]=[[width,height],[x,y,z],[rotationX,rotationY,rotationZ]];  
         var c:Array = [[[t0, t1], [0, 0, 0], [0, 0, 0]], [[t2, t1], [t0, 0, t2], [0, 90, 0]], [[t2, t1], [0, 0, t2], [0, 90, 0]], [[t0, t2], [0, 0, 0], [90, 0, 0]], [[t0, t2], [0, t1, 0], [90, 0, 0]], [[t0, t1], [0, 0, t2], [0, 0, 0]]];  
         var n:Number;  
         var s:Array = [] 
         for(var i:int=0;i<6;i++){  
           s.push(new MovieClip());     
           var m:MovieClip=s[i];  
// Aquí es donde corregí, donde tu pusiste así originalmente:
// n = (t3.length == 1)?0:1;
           n = i; 
           if(t3[n][0]==0){  
             m.graphics.beginFill(t3[n][1]);  
           };  
           m.graphics.drawRect(0,0,c[i][0][0],c[i][0][1]);  
           m.graphics.endFill();  
           m.x=c[i][1][0];  
           m.y=c[i][1][1];  
           m.z=c[i][1][2];  
           m.rotationX=c[i][2][0];  
           m.rotationY=c[i][2][1];  
           m.rotationZ=c[i][2][2];  
           m.blendMode=BlendMode.LAYER 
           e.addChild(m);              
         };  
      };  
      //rota el contenedor 
      private function rotate(evt:Event):void{  
         e.rotationY+=10;  
      };  
   }    
}

Una vez más, muchas gracias por tu paciencia, ejemplos, aclaraciones, etc. Jeje. ¡Un saludo!

P.D.: Gracias a tu código también pude corregir un elemento importante que me faltaba en el mío, que era importar el elemento import flash.display.BlendMode;, jeje.

Por miglug

Claber

113 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 06 Sep 2011 10:46 am
Por cierto, que no vi el encabezado de tu respuesta, jeje, pues la verdad, mucha gente usa el Papervision y otros motores 3D para Flash, sin embargo, usé una vez el Papervision sin posibilidad a hacer una cosa que quería por motivos de fuidez conforme a geometría, y vi mucha mucha mucha gente que se mete de lleno en la geometría manual, y claro, me pareció interesante y ahí fui, jeje, y bueno, me veo absurdo ante las cosas que hacen, sin embargo, las veo posibles si no fueran por errores como este que cometo con mi código, además, tu eres un máquina, que mi madre, siempre me libras de todas, jeje, sin embargo yo me adapto a lo que pienso y veo y salen cosas extrañas como tal nombraste, jeje, pero mientras funcione... Jeje. ¡Un saludo men! ;)

Por miglug

Claber

113 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.