‘Exploración espacial’ (parte 4): La nave.

En esta ocasión hemos procurado que el artículo ofrezca un vídeo más interesante. Para ello hemos diseñado una nave sencilla pero completita. En mi humilde opinión bastante chula dentro de su sencillez.

El diseño:
Necesitábamos que tuviera el aspecto de una nave acrobática muy manejable. Para ello no puede ser muy alargada.
No hemos recurrido a usar ninguna nave prediseñada. Hay algunas muy buenas y disponibles bajo licencia LGPL. Esta que yo aporto también se ofrece bajo licencia LGPL para que se pueda usar y modificar (siempre bajo LGPL). Continuamos sin recurrir a usar ningún modelador por coherencia con el resto del artículo y porque vi muy claro lo que quería hacer y no me pareció difícil.

El cuerpo principal:
Empecé partiendo de una esfera. La aplasté (plafch), la estiré (ñiiiak), la pegué un hachazo en la parte de atrás (chas), y rebañé un poco la panza para facilitar que se pueda posar. Con todo esto ya tenía forma básica del fuselaje a falta de dos potentes propulsores.

Los reactores principales:
Construí un par de propulsores a reacción simplemente sumando y restando formas cilíndricas y esféricas. Las toberas en la parte de atrás del reactor se han realizado con una esfera a la cual se la ha eliminado con el operador diferencia otra esfera de idéntico tamaño y un poco desplazada. No hemos implementado articulación en las toberas, pero la idea del diseño para que la nave pueda ser maniobrable es que las toberas de los reactores principales tuvieran el juego suficiente para permitir girar en horizontal y en vertical a la nave.

Los reactores secundarios:
En la panza instalé cuatro propulsores fijos para despegue vertical. Por simplificar me basé en el reactor anterior, lo giré y lo reduje de tamaño eliminando también las partes superfluas que quedarían dentro de la nave.

Los patines:
También en la panza instalé unos patines para apoyar en caso necesario sobre el terreno, salvando de un posible las toberas los cuatro reactores de despegue vertical.

Remate trasero:
En la parte posterior una simple caja me sirve para hacer que el tajo posterior a la nave no resulte tan exagerado y para insinuar una posible via de entrada a la nave suficientemente ampila para carga y descarga. Está todo sin detallar demasiado porque para este proyecto no hace mucha falta. En la parte superior trasera añadí un par de antenas blancas.

Las ventanillas delanteras:
En la parte delantera se ha diseñado unas ventanillas que simulan ser cristales tintados muy oscuros. Con ello nos evitamos tener que dar detalle a un interior de la nave que fuera visible a través de las ventanillas. Primero hice una ventanilla única recortando el fuselaje con un sólo bloque box, pero vi que no quedaba convincente, así que hice cuatro bloques para que se recortaran cuatro ventanillas y quedó perfecto.

Mi receta para modelar objetos compuestos:
Las formas complejas que tienen una misma textura y color, suelo trabajarlas fijándome en las partes que suman y en las que restan. Construyo una forma por unión de varias formas más sencillas a la cual le resto otra forma que es otra unión de varias formas más sencillas. Por decirlo de alguna manera una de las aportan material y las otras la eliminan. Luego suele ser necesario añadir otras partes que no van con la misma textura y forma.

Unas palabritas sobre macros:
No habíamos comentado hasta ahora nada sobre macros pese a que usamos algunas macros que Povray proporciona. Ahora nosotros definimos algunos objetos con macros. No debes sentirte intimidado por ellas. Aprende a usarlas, son muy potentes. Una declaración normal de las que habitualmente usamos con la sentencia ‘#declare’ asocia a un identificador un código que será expandido cuando el intérprete de Povray se lo encuentre.  Una macro viene a ser una declaración más, como cualquier otra, pero que no tiene definidos algunos valores que deben ser proporcionados. Recibe unos argumentos y en el momento que es invocada provoca toda la expansión del código declarado, sustituyendo así a los parámetros por sus valores. Además admite el uso de declaraciones locales sólo visibles para la macro. Gracias a eso se pueden usar como si fueran funciones de librería.

El programa de demo:
He realizado un programa pov que permite ver la nave desde casi todos los puntos de vista. Ello se hizo así con el fin de que se aprecie con todo detalle como está realizada integramente la nave. Se ha englobado todo ello en un recinto esférico con una decoración que nos permitirá apreciar el efecto de iluminacion de los faros, y el reflejo en la ventanilla de la nave.

Las luces laterales tienen un color más amarillento, no por nada, sino por aportar algo de originalidad al diseño. No me resulta fácil justificar la ventaja funcional de usar distintos colores en los faros, pero así lo dejaré porque me gusta como queda.

#include "colors.inc"
#include "nave_luz.inc"
#declare ColorLuz   = rgb <0.7, 0.7, 0.7>;
#declare ColorMap = color_map {
    [0.0  color rgb <0.1,0,0.1>]
    [0.02  color <0.3,0.2,0.2>]
    [0.15  color <0.5, 0.4, 0.3>]
    [1.0  color <0.6, 0.4, 0.6>]
}

#declare Crackle = texture {
    pigment {  crackle
        color_map { ColorMap }
        scale 20
    }
}

object {sphere {<0,10,0> 66 texture {Crackle} } }
light_source{ <0, 4+(clock/30),60> ColorLuz} // La luz se mueve.
camera { // la cámara se mueve en elevación (en Y)
               // y alejandose y volviendose a acercar (en Z)
    location <0,-10+(clock/20.0), 6+sin((clock-120)/27)>
    look_at <0,0,0>
    angle 29
}

object {Nave rotate y*(clock-120) } // la nave gira sobre su eje.

El código de la nave:
La nave se ha implementado de forma separada en un include para poder ser utilizado por otros porgramas.

#declare PinturaNave= Gray90;
#declare PinturaPatin= Gray60;
// **************************************************
#declare Reactor=union { // Reactores princilales
    difference {
        union{  // *** Aqui las partes que suman todas con misma textura color, etc.
            sphere {<0.3,0,0>, 0.2}
            sphere {<-0.78,0,0>, 0.25}
            cylinder {<0.3,0,0>,<-0.6,0,0>, 0.18}
        }
        union{ // *** Aquí las partes que restan
            cylinder {<0.3,0,0>,<-1,0,0>, 0.12}
            sphere {<-0.8,0,0>, 0.25}
        }
        pigment {PinturaNave}
    }
     object{ // Superficie blanca para simular fuente de luz mediante una luz cercana.
            cylinder {<-0.6001,0,0>,<-0.6002,0,0>, 0.18}
            pigment { White }
     }
     light_source{ <-0.62,0,0> color White // Luz del reactor
     fade_distance 0.3 // Distancia de atenuación
     fade_power 2 // atenuación exponencial
}
}

// **************************************************
#declare Reactor2=union{ // Reactores pequeños para despegue vertical
    difference {
        union{  // *** Aqui las partes que suman todas con misma textura color, etc.
            cylinder {<0,0,0>,<-0.6,0,0>, 0.18}
            sphere {<-0.78,0,0>, 0.25}
        }
        union{ // *** Aquí las partes que restan
            cylinder {<0,0,0>,<-1,0,0>, 0.15}
            sphere {<-0.8,0,0>, 0.25}
        }
    }
    light_source{ <-0.62,0,0> color White // Luz del reactor
        fade_distance 0.2 // Distancia de atenuación
        fade_power 2 // atenuación exponencial
    }
    pigment {PinturaNave}
    rotate z*90
    scale 0.38
}

// **********************
#declare Patin= object {
    union {
        torus { 0.14, 0.032 }
        cone {<0,0,0.14>, 0.04 <0,0,-0.14>, 0.12}
    }
    pigment {PinturaPatin}
    rotate x*90
    translate <0,-0.16,0>
}

// *******************************************
// ** Define un faro con una potencia de luz
// ** y un ángulo de luz
// *******************************************
#macro Faro (ColorLuzFaro, RadFaro)
    #local Fall=RadFaro*3;  // Radio de falloff
    #local P_Trasero   =<-0.05,-0.12,0> ; // Punto trasero del foco
    #local P_Delantero =< 0.05,-0.12,0> ; // Punto delantero del foco
    #local P_Luz       =< 0.1,-0.12,0>; // Un poco más alante del faro
    union {
        object { // El faro es un tronco de cono sólido.
            cone { P_Trasero , 0.04 P_Delantero, 0.055 }
            pigment {White}
        }
        light_source{ P_Luz // Luz de proximidad al foco.
            color ColorLuzFaro*.5
            fade_distance 0.3 // Distancia de atenuación
            fade_power 2 // atenuación exponencial
        }
        object {
            light_source { <0,0,0> ColorLuzFaro // ¡OJO!  No podemos poner aquí P_Luz antes de girar.
                spotlight point_at (P_Delantero - P_Trasero) // Apuntar en la dirección que apunta el faro.
                radius RadFaro falloff Fall
            }
            translate P_Luz
        }
}
#end

// ******************************************
// ** Fabrica un faro triple.
// ******************************************
#macro TripleFaro(ColorLateral, ColorCentral)
    union {
        object {Faro(ColorLateral, 4) rotate y*(16) translate <-0.03, 0,  -0.14>}
        object {Faro(ColorCentral,4.5)}
        object {Faro(ColorLateral,  4) rotate y* (-16) translate <-0.03, 0, 0.14>}
     }
#end

// **************************************************
#declare SepVent= 0.02;
#declare BoxVentanilla = union{
    box {<1,0.52,-1>            <0.7,0.3,-0.3-SepVent>  }
    box {<1,0.52,-0.3+SepVent>  <0.7,0.3,    -SepVent>  }
    box {<1,0.52, SepVent>      <0.7,0.3, 0.3-SepVent>  }
    box {<1,0.52,0.3+SepVent>   <0.7,0.3,           1>  }
}

// **************************************************************
#declare CuerpoNave= object {
    difference{ // Cuerpo principal
        union { // *** Aqui las partes que suman todas con misma textura color, etc.
            sphere {<0,0,0> 1}
        }
        union{ // *** Aquí las partes que restan
            box {BoxVentanilla} // hueco
            box {<-0.2,1,1> <-1,-1,-1> } // corte trasero
            box {<1,-0.5,1> <-1,-1,-1> } // corte panza
        }
    }
    pigment {PinturaNave}
    scale <2,0.3,1>
}

// **************************************************
#declare Ventanilla = object {
    intersection{ // Cabina cristal tintado (realmente es opaco)
        sphere {<0,0,0> 1}
        box {BoxVentanilla}
    }
    pigment {Gray20} // casi negra
    finish { reflection {0.4} phong 0.7 phong_size 7 }
    scale <2,0.3,1>
}

// **************************************************
#declare PuertaDeCarga = object {
    box {<-0.4, 0.2, 0.4>, <-0.6, -0.1, -0.4>}
    pigment {PinturaNave}
}

// **************************************************
#declare Antenas = object{
    union {
        cylinder {<.3,0, 0.4>,<-0.4,.4,0.4>,0.02 }   // *** antena
        cylinder {<.3,0,-0.4>,<-0.4,.4,-0.4>,0.02 }   // *** antena
    }
    pigment {White}
}

// ****************************************************************
// ************************   N A V E  ********************************
// ****************************************************************
#declare ColorFaroCentral= rgb <0.8, 0.8, 1>;
#declare ColorFaroLateral= rgb <0.8, 0.8, 0.4>;
#declare Nave = object {
    union {
        object{CuerpoNave}
        object{Ventanilla}
        object{Antenas}
        object{TripleFaro(Orange, White) translate<1.87,0,0>}
        object{PuertaDeCarga}
        object{Reactor translate<0, 0.05, -0.75> }
        object{Reactor translate<0, 0.05, 0.75> }
        object{Reactor2 translate<0, 0.07, 0.6> }
        object{Reactor2 translate<0, 0.07, -0.6> }
        object{Reactor2 translate<1.1, 0.07, -0.5> }
        object{Reactor2 translate<1.1, 0.07,  0.5> }
        object{Patin translate <-0.2, 0, 0.75>} // 0.6>
        object{Patin translate <-0.2, 0, -0.75>}
        object{Patin translate <1.3,0, 0.35>}
        object{Patin translate <1.3,0, -0.35>}	// -0.4>
    }
    translate <-0.33,0,0> // trasladamos para adelantar el centro del objeto
}

Share

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*