3.5.1  Objeto Mesh (malla)

Sabes que has estado trazando demasiado tiempo cuando ...
... Piensas que la teoría de la evolución estaba basada en el origen triangular de la rueda.
-- Mark Kadela

Los objetos Mesh son muy útiles porque nos permiten crear objetos que contienen cientos o miles de triángulos. Comparado con una simple unión de triángulos, el objeto Mesh almacena los triángulos más eficientemente. Las copias de objetos mesh (en adelante malla) sólo necesitan un poco de memoria adicional porque los triángulos se guardan sólo una vez..

Se puede hacer una aproximación de casi cualquier objeto utilizando triángulos, pero necesitaremos muchos triángulos para crear formas más complejas. Por ello crearemos una malla muy simple como ejemplo. Este ejemplo os mostrará una característica muy útil de las mallas de triángulos: se puede asignar una textura diferente a cada triángulo en la malla.

Empecemos. Haremos un simple cubo con lados de diferente color. Creamos un archivo vacío llamado meshdemo.pov y añadimos las siguientes líneas. Ten en cuenta que una malla se declara - no te sorprenderá- utilizando el identificador mesh.

  camera {
    location <20, 20, -50>
    look_at <0, 5, 0>
  }
  light_source { <50, 50, -50> color rgb<1, 1, 1> }
  #declare Red = texture {
    pigment { color rgb<0.8, 0.2, 0.2> }
    finish { ambient 0.2 diffuse 0.5 }
  }
  #declare Green = texture {
    pigment { color rgb<0.2, 0.8, 0.2> }
    finish { ambient 0.2 diffuse 0.5 }
  }
  #declare Blue = texture {
    pigment { color rgb<0.2, 0.2, 0.8> }
    finish { ambient 0.2 diffuse 0.5 }
  }

Debemos declarar todas las texturas que queramos dentro de la malla antes de crear la misma. Las texturas no se pueden especificar dentro de la malla debido al pobre rendimiento de memoria resultante.

Ahora añadimos el objeto malla. Tres lados del cubo utilizarán texturas individuales y los restantes usarán la textura global de la malla.

  mesh {
    /* cara de arriba */
    triangle {
      <-10, 10, -10>, <10, 10, -10>, <10, 10, 10>
      texture { Red }
    }
    triangle {
      <-10, 10, -10>, <-10, 10, 10>, <10, 10, 10>
      texture { Red }
    }
    /* cara de abajo */
    triangle { <-10, -10, -10>, <10, -10, -10>, <10, -10, 10> }
    triangle { <-10, -10, -10>, <-10, -10, 10>, <10, -10, 10> }
    /* cara izquierda */
    triangle { <-10, -10, -10>, <-10, -10, 10>, <-10, 10, 10> }
    triangle { <-10, -10, -10>, <-10, 10, -10>, <-10, 10, 10> }
    /* cara derecha */
    triangle {
      <10, -10, -10>, <10, -10, 10>, <10, 10, 10>
      texture { Green }
    }
    triangle {
      <10, -10, -10>, <10, 10, -10>, <10, 10, 10>
      texture { Green }
    }
    /* cara frontal */
    triangle {
      <-10, -10, -10>, <10, -10, -10>, <-10, 10, -10>
      texture { Blue }
    }
    triangle {
      <-10, 10, -10>, <10, 10, -10>, <10, -10, -10>
      texture { Blue }
    }
    /* cara trasera */
    triangle { <-10, -10, 10>, <10, -10, 10>, <-10, 10, 10> }
    triangle { <-10, 10, 10>, <10, 10, 10>, <10, -10, 10> }
    texture {
      pigment { color rgb<0.9, 0.9, 0.9> }
      finish { ambient 0.2 diffuse 0.7 }
    }
  }

Trazando esta escena a 320x240 veremos que las caras de arriba, abajo, derecha y frontal del cubo tienen diferentes texturas. Aunque éste no es un ejemplo muy impresionante, muestra lo que puede hacerse con los objetos malla. Se pueden encontrar ejemplos más complejos, utilizando también triángulos suavizados, en el directorio de escenas como chesmsh.pov.