| 
  | 
On povray.general someone brought up the subject of greebles
(late 70's SF hull plates) again.
So here is a scene that I started ahwile ago and ran out
of steam on.  In the mess of spagheti pov code are some
macros I wrote that make greebles.  Maybe someout out there
can use it as a starting point for a better greeble
generator.
The line wrapping will kill this file, *sigh* ....
-- 
-- begin pachubek_02.pov --
--
/* clusters of rectangular blockoids around sphere which
   has a blue glow around it.  Very tech.  Very 10th. 
   It doesn't look cool yet though. */
#declare ntsc = false;
#declare rseed = seed(27987642);
#declare our_gamma = 2.2;  // brighter than usual
#declare which_view = 1;
#declare overlay = false;
#declare glow_radius = 8;
#declare glow_hue = <0, 0.6, 1>;
#declare sphere_radius = 4;  // must be less than glow_radius
#declare cut_depth = 0.02;
global_settings {
  assumed_gamma our_gamma
  number_of_waves 11
  max_trace_level 16
  radiosity {
    brightness 3.3 // defualt value if 3.3
    count 100 // default value is 100
    error_bound 0.1
    distance_maximum 11 // guess - 11 times the hieght of the object
  }
}
#macro rnd_rotate()
  rotate <360 * rand(rseed), 360 * rand(rseed), 360 * rand(rseed)>
#end
#macro rnd_translate()
  translate <4 - 8 * rand(rseed), 4 - 8 * rand(rseed), 4 - 8 * rand(rseed)>
#end
#macro perturb()
  rnd_translate()
  rnd_rotate()
#end
#macro camera_transforms()
  #switch (which_view)
    #case (0)
      rotate x*17
      rotate y*4
      translate <-1.4, 6.1, -20>
      #break
    #case (1)
      rotate z*15  // batman
      rotate x*10  // point camera down
      rotate y*10  // turn (pan?) to the right
      translate <-4.42, 4.41, -25>
      #break
    #else  // looking DOWN
      rotate x*85
      translate <6, 50, -8>
  #end // end switch
#end
fog {
  distance 400
  color rgb <0, 0.2, 0.4>
}
camera {
  location 0
  direction <0, 0, 1.6>
  #if (ntsc = true)
    right <(640 / 400) * (10 / 11), 0, 0>
  #else
    right <(640/480), 0, 0>
  #end
  up <0, 1, 0>
  camera_transforms()
}
background { color rgb <0, 0.2, 1> * 0.2 }
// http://www.crosswinds.net/~chiasm/bwcontents.html <-- uses electribe ER1 -
*G.G.*
#macro add_text(start_pt, ft_height, the_str)
  text {
    ttf "crystal.ttf" the_str, 0.05, 0
    translate <0, 0, -0.025>
    scale ft_height
    translate start_pt
  }
#end
#if (overlay = true)
  union {
    // text in upper left corner
    add_text(<-0.75, 0.52,         0>, 0.035, "Island: none in range")
    add_text(<-0.75, 0.52 - 0.035, 0>, 0.035, "Status: DEFJAM-1")
    // text in lower right corner
    add_text(<0.3, -0.57 + 0.035, 0>, 0.035, "      overthruster: sined")
    add_text(<0.3, -0.57,         0>, 0.035, "  http://www.whatever.com")
//    cylinder { <0, 0.25, 0>, <0, -0.25, 0>, 0.001 }   // crosshairs
//    cylinder { <0.25, 0, 0>, <-0.25, 0, 0>, 0.001 }
    pigment { color rgb glow_hue }
    finish { ambient 1 diffuse 0 }
    translate <0, 0, 2>
    camera_transforms()
  }
#end
#declare main_texture = texture {
  //pigment { color rgb 1 }
  pigment { color rgb 0.7 }
  finish { ambient 0.2 diffuse 0.8 specular 0.5 roughness 1 }
}
#declare main_texture_dark = texture {
  pigment { color rgb 0 }
  finish { ambient 0.2 diffuse 0.8 }
}
#declare main_texture_darker = texture {
  pigment { color rgb 0.1 }
  finish { ambient 0.2 diffuse 0.8 specular 0.6 }
}
sphere {
  0, 4 - (cut_depth / 2)
  pigment { color rgb glow_hue }
  finish { ambient 1 diffuse 0 }
}
intersection { // central sphere
  sphere { 0, 4 }
  union {
    torus { 4, cut_depth }
    #declare eliv = 90 / 6;
    #while (eliv < 90)
      torus {
        sphere_radius * cos(radians(eliv)), cut_depth
        translate <0, sphere_radius * sin(radians(eliv)), 0>
      }
      torus {
        sphere_radius * cos(radians(eliv)), cut_depth
        translate <0, -sphere_radius * sin(radians(eliv)), 0>
      }
      #declare eliv = eliv + (90 / 6);
    #end
    #declare roty = 0;
    #while (roty < 360)
      torus { sphere_radius, cut_depth rotate z*90 rotate y*roty }
      #declare roty = roty + (360 / 24);
    #end
    inverse
  }
  texture { main_texture_dark }
  bounded_by {
    sphere { 0, sphere_radius + cut_depth + 1.0001 }
  }
}
union { // techie blockoids around the sphere
  #declare cc = 0;
  #while (cc < 500)
    #declare elivation = 90 * rand(rseed);
    #if (rand(rseed) < cos(radians(elivation)))
      #if (rand(rseed) < 0.5)
        #declare elivation = 0 - elivation;
      #end
      #declare roty = 360 * rand(rseed);
      #declare y_size = 0.03 + 0.19 * rand(rseed);
      #declare z_size = 0.06 + 0.14 * rand(rseed);
      #declare x_size = 0.03 + 0.19 * rand(rseed);
      box {
        <4.27, -y_size, -z_size>,
        <4.27 + x_size, y_size, z_size>
        rotate z*elivation
        rotate y*roty
      }
      #declare cc = cc + 1;
    #end
  #end
  texture { main_texture_dark }
}
              
#declare smooth_glow = density {
  spherical
  //scale glow_radius
  color_map {
    [ 0 color rgb glow_hue ]
    [ 1 color rgb glow_hue ]
  }
}
#declare bumpy_glow = density {
  bozo
  scale 1/8
  color_map {
    [ 0.0 color rgb 0 ]
    [ 1.0 color rgb glow_hue ]
  }
}
#declare smooth_absorb = density {
  spherical
  //scale glow_radius
  color_map {
    [ 0 color rgb 1 - glow_hue ]
    [ 1 color rgb 1 - glow_hue ]
  }
}
#declare bumpy_absorb = density {
  bozo
  scale 1/16
  color_map {
    [ 0.0 color rgb 0 ]
    [ 1.0 color rgb 1 - glow_hue ]
  }
}
sphere { // glow around the sphere
  0, glow_radius
  hollow
  pigment { color rgbf 1 }
  finish { ambient 1 diffuse 0 }
  interior {
    media { // glow
      emission 1
      density {
        spherical
        scale glow_radius
        density_map {
          [ 0.0 bumpy_glow ]
          [ sphere_radius / glow_radius smooth_glow ]
        }
      }
      density {
        spherical
        scale glow_radius
        color_map {
          [ 0.0 color rgb 0 ]
          [ sphere_radius / glow_radius color rgb glow_hue / glow_radius ]
          [ sphere_radius / glow_radius color rgb 0 ]
        }
      }
    }
    media { // absorption
      absorption 1
      density {
        spherical
        scale glow_radius
        density_map {
          [ 0.0 bumpy_absorb ]
          [ sphere_radius / glow_radius smooth_absorb ]
        }
      }
      density {
        spherical
        scale glow_radius
        color_map {
          [ 0.0 color rgb 0 ]
          [ sphere_radius / glow_radius color rgb (1 - glow_hue) / glow_radius
]
          [ sphere_radius / glow_radius color rgb 0 ]
        }
      }
    }
  }
}
/* ring of little glows */
#macro ring_blocks_y(ring_rad)
  #local rroty = 0;
  #local ring_gap = (6 / ring_rad) * 9;
  #while (rroty < 360)
    #local b_width = (1 + rand(rseed)) * 0.1; // width of peice
    sphere {
      0, 0.4
      hollow
      no_shadow
      pigment { color rgbf 1 }
      finish { ambient 0.5 diffuse 0.5 }
      interior {
        media {
          emission 1   
          density {    
            spherical  
            // scale 0.2    
            color_map {
              [ 0.6 color rgb 0 ]
              [ 0.8 color rgb glow_hue ]
              [ 1.0 color rgb 1 / 0.3 ] 
            }
          }
        }
        media {
          absorption 1   
          density {    
            spherical  
            // scale 0.2    
            color_map {
              [ 0.6 color rgb 0 ]
              [ 0.8 color rgb 1 - glow_hue ]
              [ 1.0 color rgb 1 / 0.3 ] 
            }
          }
        }
      }
      translate <ring_rad, 0, 0>
      rotate y*rroty
    }
    #local rroty = rroty + ring_gap + ring_gap * 1.333 * rand(rseed);
  #end
#end
union {
  ring_blocks_y(7)
}
// now for some death star tiles in the background - the whole render is now
// inside a textured air shaft
#macro do_quad(c1, c2, c3, c4) // clockwise or counterclockwise order, not
col-row order
  triangle { c1, c2, c3 }
  triangle { c1, c3, c4 }
#end
#macro do_box(c1, c2) // same parameter format as for a box object
  // back wall
  triangle { c1, <c2.x, c1.y, c1.z>, <c2.x, c2.y, c1.z> }
  triangle { c1, <c2.x, c2.y, c1.z>, <c1.x, c2.y, c1.z> }
  // left wall
  triangle { c1, <c1.x, c1.y, c2.z>, <c1.x, c2.y, c2.z> }
  triangle { c1, <c1.x, c2.y, c2.z>, <c1.x, c2.y, c1.z> }
  // right wall
  triangle { <c2.x, c1.y, c2.z>, <c2.x, c1.y, c1.z>, c2 }
  triangle { <c2.x, c1.y, c1.z>, c2, <c2.x, c2.y, c1.z> }
  // bottom
  triangle { <c1.x, c2.y, c2.z>, <c1.x, c2.y, c1.z>, <c2.x, c2.y, c1.z> }
  triangle { <c1.x, c2.y, c2.z>, <c2.x, c2.y, c1.z>, c2 }
  // top
  triangle { <c1.x, c1.y, c2.z>, c1, <c2.x, c1.y, c1.z> }
  triangle { <c1.x, c1.y, c2.z>, <c2.x, c1.y, c1.z>, <c2.x, c1.y, c2.z> }
  // front
  triangle { <c1.x, c1.y, c2.z>, <c2.x, c1.y, c2.z>, c2 }
  triangle { <c1.x, c1.y, c2.z>, c2, <c1.x, c2.y, c2.z> }
#end
#macro rnd(int_max)
  #local rnd_r = int(int_max * rand(rseed));
  rnd_r
#end
#macro rrange(r_low, r_high)
  #local dummy = rand(rseed); // skip a number
  #local real_low = min(r_low, r_high); 
  #local real_high = max(r_low, r_high); 
  #local rresult = rand(rseed) * (real_high - real_low) + real_low;
  rresult
#end
#macro do_poly(numpts, pts)  // pts is an array of points in clockwise or
counterclockwise
// order.  Also: the polygon had better be convex (as in Opticks)
// it can handle noncoplaner although the results might be a bit wrinkly
  #local cc = 1;
  #while (cc < (numpts - 1))
    triangle {
      pts[0],
      pts[cc],
      pts[mod(cc + 1, numpts)]
    }
    #local cc = cc + 1;
  #end
#end
#macro do_cylinder_y( y1, y2, xx, zz, c_radius, num_pts)
  #local pts1 = array[num_pts]
  #local pts2 = array[num_pts]
  #local roty = 0;
  #while (roty < num_pts)
    #local pts1[roty] = <
      c_radius * cos(radians(roty * (360 / num_pts))),
      0,
      c_radius * sin(radians(roty * (360 / num_pts)))
    >;
    #local pts2[roty] = pts1[roty];
    #local pts1[roty] = pts1[roty] + <xx, y1, zz>; // translate
    #local pts2[roty] = pts2[roty] + <xx, y2, zz>; // translate
    #local roty = roty + 1;
  #end
  do_poly(num_pts, pts1)
  do_poly(num_pts, pts2)
  // Ok. endcaps are done.  Now for tubular part
  #local roty = 0;
  #while (roty < num_pts)
    do_quad(
      pts1[roty],
      pts2[roty],
      pts2[mod(roty + 1, num_pts)],
      pts1[mod(roty + 1, num_pts)]
    )
    #local roty = roty + 1;
  #end
#end
#macro do_something(xx, xsize, zz, zsize, ds_height)
  #local d = int(3 * rand(rseed));
  #local thick = (0.4 + 0.6 * rand(rseed)) * ds_height;
  #switch (d)
    #case (0)  // circle
      #local cradius = min(xsize, zsize) / 2;
      #local pos = (<xx, 0, zz> + <xx + xsize, 0, zz + zsize>) / 2;
      do_cylinder_y(
        pos.y, pos.y + thick, xx, zz, cradius, 40 // last number is # of
facets
      )
      #break
    #else  // box
      do_box(<xx, 0, zz>, <xx + xsize, thick, zz + zsize>)
  #end
#end
#macro do_greeble_square(cOords, maxborder, gs_height) // expects a 3-vector. 
ignores y component of vector
  #local cc = 0;
  #local maxradius = 0.95 * maxborder;
  #while (cc < 50)
    // First determine X and Z sizes of the shape
    #local xsize = ((1 + 3 * rand(rseed)) / 12) * maxradius; // 12 was 8,
maybe go to 16?
    #local zsize = ((1 + 3 * rand(rseed)) / 12) * maxradius;
    // Secondly, determine (taking account of the size) the location of the
shape
    #local xx = ((maxradius * 2) - xsize) * rand(rseed) - maxradius;
    #local zz = ((maxradius * 2) - zsize) * rand(rseed) - maxradius;
    // draw the shape
    do_something(cOords.x + xx, xsize, cOords.z + zz, zsize, gs_height)
    #local cc = cc + 1;
  #end
//  // base plate
//  do_box(
//    <cOords.x - maxborder, cOords.y, cOords.z - maxborder>,
//    <cOords.x + maxborder, cOords.y + 0.001, cOords.z + maxborder>
//  )
#end
#macro do_block_tile_r(c1, c2, r_lev, r_dir) // c1 is lower left front , c2 is
upper right back
  #if (r_lev < 1) // stop recursing - actually draw the box
    do_box(c1, c2)
  #else // split up and then recurse
    #local new_r_lev = r_lev - 1;
    #local which_way = rnd(8);
    #if (which_way = 0) // split in same direction as last level
      #local which_way = r_dir;
    #else               // split the other direction as last level
      #if (r_dir = 0)
        #local which_way = 1;
      #else
        #local which_way = 0;
      #end
    #end
    #if (which_way = 0) // split along Z
      // if the size of the block along the Z is too small, strange things
      // may happen when we try to split the blocks.  So we set an
      // arbitrary
      // cutoff at 0.0001 and will not recurse below that size
      #local fudge = abs(c2.z - c1.z) * 0.2;
      #local split_point = rrange(c1.z + fudge, c2.z - fudge);
      #local new_y_back = c2.y - (abs(c2.y - c1.y) * (0.4 * rand(rseed)));
      #local new_y_front = c2.y - (abs(c2.y - c1.y) * (0.4 * rand(rseed)));
      do_block_tile_r(c1, <c2.x, new_y_front, split_point,>, new_r_lev,
which_way) // front one
      do_block_tile_r(<c1.x, c1.y, split_point>, <c2.x, new_y_back, c2.z>,
new_r_lev, which_way) // back one
    #else // split along X
      #local fudge = abs(c2.x - c2.x) * 0.2;
      #local split_point = rrange(c1.x + fudge, c2.x - fudge);
      #local new_y_left = c2.y - (abs(c2.y - c1.y) * (0.4 * rand(rseed)));
      #local new_y_right = c2.y - (abs(c2.y - c1.y) * (0.4 * rand(rseed)));
      do_block_tile_r(c1, <split_point, new_y_left, c2.z>, new_r_lev,
which_way) // left one
      do_block_tile_r(<split_point, c1.y, c1.z>, <c2.x, new_y_right, c2.z>,
new_r_lev, which_way) // right one
    #end
  #end
#end
#macro do_block_tile(c1, c2, r_lev) // c1 is lower left front , c2
// is upper right back
  #local initial_direction = rnd(2);
  do_block_tile_r(c1, c2, r_lev, initial_direction)
#end
// pause to make some tiles
- two algorithms
#macro do_up_a_tile()
  // just use both algorithms.
  do_block_tile(<-1, 0, -1>, <1, 0.07, 1>, 5) // newer method
  do_greeble_square(<0, 0, 0>, 1, 0.09) // older method
#end
#declare tay = array[6]
#declare tay[0] = mesh { do_up_a_tile() }
#declare tay[1] = mesh { do_up_a_tile() }
#declare tay[2] = mesh { do_up_a_tile() }
#declare tay[3] = mesh { do_up_a_tile() }
#declare tay[4] = mesh { do_up_a_tile() }
#declare tay[5] = mesh { do_up_a_tile() }
#declare yy = -400; // plate the walls with hull greebles
#while (yy <= 30)
  #declare roty = 0;
  #while (roty < 360)
    #declare dummy = rand(rseed); // better random?
    object {
      tay[rnd(6)]
      rotate y*90 * int(4 * rand(rseed))
      rotate x*-90
      scale 2.1
      translate <0, yy * 4.15, 30>
      rotate y*roty
      pigment { color rgb <0.5, 0.75, 1> * 0.7 }
      finish { ambient 0.3 diffuse 0.7 }
    }
    #declare roty = roty + 8; // 6
  #end
  #declare yy = yy + 1;
#end
#declare walkway = texture {
  pigment { color rgb 0.6 * <0.5, 0.75, 1> }
  finish { ambient 0.3 diffuse 0.7 }
}
#declare walkway_glow = texture {
  pigment { color rgb <0.5, 0.75, 1> }
  finish { ambient 1 diffuse 0 }
}
#declare walkway_stripe = texture {
  gradient <0, 0, 1>
  texture_map {
    [ 1/2 - 0.1 walkway_glow ]
    [ 1/2 - 0.1 walkway ]
    [ 1/2 + 0.1 walkway ]
    [ 1/2 + 0.1 walkway_glow ]
  }
}
#declare roty = 0;
#while (roty < 360)
  box { // walkway?
    <-0.4, -0.03, -9>, <0.4, 0.03, -30>
    texture {
      gradient <1, 0, 0>
      texture_map {
        [ 0.3 walkway ]
        [ 0.3 walkway_stripe scale 0.9 ]
        [ 0.35 walkway_stripe scale 0.9 ]
        [ 0.35 walkway ]
      }
      translate <0, 0, -0.45> // to line up stripes with end of walkway
    }
    rotate y*(roty + 24)
  }
  #declare roty = roty + 45;
#end
light_source {
  <6, 50, -2>
  color rgb <0.3, 0.4, 0.5> * 0.5
}
light_source {
  <-5, -50, -20>
  color rgb <0.2, 0.4, 0.6> * 0.5
}
light_source {
  <0, -500, 0>
  color rgb <0, 0.4, 1>
  fade_power 1.1
  fade_distance 50
}
/* actual end of this file */
 Post a reply to this message 
 | 
  |