domingo, 22 de abril de 2012

NODOS DE AGRUPACIÓN Y TRANSFORMACIÓN

Hasta ahora hemos visto los objetos aisladamente. Veamos ahora cómo podemos agruparlos para conseguir formas más complejas. Existen diversos nodos que nos permiten agrupar objetos:

Nodo Group:  

     El nodo Group permite unir un conjunto de nodos de forma que actúen como una entidad única, pero sin efectuar ninguna transformación en ellos. La principal característica de este tipo de grupo es que los objetos son creados todos en el mismo punto (en el centro del escenario de realidad virtual). 

Sintaxis:  
        Group { 
     children [ ... ] 
    }
  
      El campo children contiene la lista de los objetos que se quieren agrupar, representados por sus nodos Shape respectivos:   

Ejemplo: 
        Group {
    children [ 
    Shape { ... }.
    Shape { ... },  ...
    ]
    }


Ejemplo:
 

     #VRML V2.0 utf8
     Group { 
     children [ 
    Shape {
    appearance Appearance {
      material Material {   }
      }
    geometry Box { 
    size 2.0 0.5 3.0 
    }
     }
    Shape {
    appearance Appearance {
    material Material {   }
    }
    geometry Cone {
    height 3.0
    bottomRadius 0.75
    }  ]  }  
Nodo Transform:

    Por defecto todos los objetos (Shapes) se construyen en el centro del escenario virtual. El nodo transform nos va a permitir evitar esto, indicando la posición, orientación y tamaño de los diferentes objetos que va a crear. 

Sintaxis: 
    Transform{
    translation  Eje_X  Eje_Y  Eje_Z
    rotation      Eje_X  Eje_Y  Eje_Z  Ángulo
    scale          Eje_X  Eje_Y  Eje_Z
    children[...]
    }    
     Cada grupo creado mediante el nodo Transform va a poseer su propio sistema de coordenadas, cuyos atributos se determinan a través de los campos translationrotation scale, los cuales son optativos.    
 El campo translation permite indicar la posición del origen del nuevo sistema de coordenadas perteneciente al grupo dentro del sistema de coordenadas de nodo que lo engloba (nodo padre). A través del siguiente ejemplo esta idea quedará más clara: 

Ejemplo: 
    Transform{
    translation 2.0 0.0 0.0
    children [...]
    }   
     Mediante este ejemplo se consigue que el grupo creado tenga un sistema de coordenadas idéntico a sistema de coordenadas principal, con la única salvedad de que su origen se encontraría desplazado dos unidades sobre el eje X del sistema principal. También es posible apreciar en este ejemplo que sólo se han de contemplar los campos que interesen, ignorándose el resto.
 
Gráficamente los pasos serían los siguientes:  

     I) Partimos del sistema de coordenadas del nodo padre:


       
     II) Realizamos la translación del sistema de coordenadas del grupo:


 
      Un ejemplo sería el siguiente:  


  
 El campo rotation nos permite girar el sistema de coordenadas del grupo alrededor de uno de los ejes del sistema de coordenadas del nodo padre. Para ello, además de indicar sobre que eje se desea realizar el giro, se ha de hacer referencia al grado de inclinación de dicho giro (en radianes).  

Ejemplo: 
    Transform{   
    rotation 0.0 0.0 1.0   0.52
      children [...]  
    }    
     Con este ejemplo se pretende hacer girar el sistema de coordenadas del grupo sobre el eje Z 0.52 radianes. Nótese que solamente uno de los ejes puede tomar un valor (que ha de ser forzosamente la unidad) mientras el resto ha de permanecer a cero. De esta forma sólo hay tres combinaciones posibles con las que rellenar los ejes del campo rotation:  


Rotación sobre el eje X1.00.00.0
Rotación sobre el eje Y0.01.00.0
Rotación sobre el eje Z0.00.01.0

      Gráficamente los pasos serían los siguientes:  

     I) Partimos del sistema de coordenadas del nodo padre:  


     II) Realizamos la rotación del sistema de coordenadas del grupo: 


      Un ejemplo sería el siguiente:  


  

 A través del campo scale podemos aumentar o reducir el tamaño de los ejes del sistema de coordenadas del grupo utilizando factores de escala que toman como referencia los ejes de coordenadas del sistema del nodo padre. De esta forma aumentamos o disminuimos el tamaño de los objetos que se crean.  

Ejemplo: 
    Transform
    {
    scale      0.5 0.5 0.5
    children [...]
    }  
     
     El ejemplo anterior hace que los ejes del sistema de coordenadas del grupo sean un 50% (0.5) más pequeños que los ejes del sistema principal y por lo tanto el objeto diseñado en estos ejes reducirá su tamaño a la mitad. Si se hubiese querido que fuesen el doble de grandes, el ejemplo hubiese sido el siguiente:  
 Ejemplo: 
    Transform
    {
    scale      2     2    2 
    children [...]
    }   
     Gráficamente los pasos serían los siguientes:
 
     I) Partimos del sistema de coordenadas del nodo padre:  



      II) Realizamos la translación del sistema de coordenadas del grupo:  



      Un ejemplo sería el siguiente:  


 
     Por último, se muestra un ejemplo en el que se unen las diferentes modificaciones sobre el sistema de coordenadas de un grupo:  

Ejemplo: 
    Transform{
    translation 2.0 0.0 0.0
    rotation 0.0 0.0 1.0   0.52
    scale       0.5 0.5 0.5
    children [...]
    }
     Gráficamente si se realizasen estas tres operaciones sobre un cilindro obtendríamos los siguiente:  


Poniendo nombres propios a los nodos:  

     Hay una solución prevista para simplificar las repeticiones de objetos dentro de un escenario virtual. Esta solución consiste en asignar un nombre arbitrario al nodo que se piensa repetir en el código.  

     Supongamos, por ejemplo, que se van a utilizar repetidamente en un escenario unos cilindros exactamente iguales (que podrían ser las columnas de una casa).Dichos cilindros tendrán el siguiente código: 

     Shape {
    appearance Appearance {
    material Material { }
     }
    geometry Cylinder {
    height 2.0
    radius 0.5
    }
    }
 (Este es el código de un cilindro con la apariencia por defecto, de 2 unidades de alto y una base de radio 0.5)  

     Se puede definir, para el ámbito de un documento VRML, que este tipo de cilindro tenga un nombre arbitrario, por ejemplo ColumnaRepetida (o como se desee, con tal de que comience por mayúscula), de la siguiente manera:   


     DEF ColumnaRepetida Shape {
    appearance Appearance {
    material Material { }
    }
    geometry Cylinder {
    height 2.0
    radius 0.5
    }
    }
      Entonces, cada vez que se quiera usar este nodo en otra parte del documento, basta con poner lo siguiente:  
 USE ColumnaRepetida
      En el ejemplo anterior de la caja y el cono, aparece el nodo Appearancerepetido. Vamos a definirlo, en la primera ocasión que se utiliza con el nombre, "PorDefecto" y la segunda vez que se usa lo invocaremos mediante el comando USE 
     #VRML V2.0 utf8 
    Group { 
    children [
    Shape { 
    appearance DEF PorDefecto Appearance {
    material Material {   }  
    } 
    geometry Box  {size 2.0 0.5 3.0 } },
    Shape {
    appearance USE PorDefecto 
    geometry Cone 
    { height 3.0 bottomRadius 0.75  } 
    } 
    ] 
    }
      En este caso concreto, la simplificación no ha sido muy grande (sólo un par de líneas menos de código), pero ha servido para ilustrar el concepto.