POV-Ray : Newsgroups : povray.newusers : Aligning objects : Re: Aligning objects Server Time
4 Nov 2024 19:19:22 EST (-0500)
  Re: Aligning objects  
From:
Date: 6 Jun 2003 18:56:37
Message: <3ee11c25$1@news.povray.org>
// Hi Stephen,
//
// here is some more rhombic dodecahedron (r.d.) stuff, now with faces
// as individual objects, and with macros to put arbitrary objects
// onto a face. The xy-area mentioned in my last post matches the
// face, the points with positive z will go to the inside (so face
// objects should have z<=0), points with negative z will go to the
// outside (this way objects are attached to a face).
// The other maco puts objects on the xz-plane onto a face; -y goes
// to inside, y to outside.
//
// Of course an r.d. with attached r.d.'s may itself be attached to
// an r.d., and so on ...
//
//
//    Sputnik
//
//
// ----------------------------

// fr### [at] computermuseumfh-kielde
// ----------------------------


// finish, textures =====================================================


#declare Fin =
  finish {
    ambient 0.3
    diffuse 0.5
    specular .2 roughness .02
    }

#declare Wood1 =
  texture {
    pigment { wood
      ramp_wave
      color_map { [.45 rgb <.95, .90, .55> ]
                  [.55 rgb <.80, .65, .35> ] }
      turbulence <0.06, 0.01, 0.06> octaves 1
      scale 0.05 rotate 87*y translate -0.3*z
      }
    finish { Fin }
    }

#declare Wood2 =
  texture {
    pigment { wood
      ramp_wave
      color_map { [ 0 rgb <.75, .45, .2> ]
                  [.8 rgb <.50, .22, .1> ] }
      turbulence <0.06, 0.01, 0.06>
      scale 0.05 rotate 87*y translate -0.3*z
      }
    finish { Fin }
    }

#declare Test = texture {
  pigment { image_map { png "test" } // test.png is in include directory
    translate <-0.5, -0.5, 0>
    scale <2, sqrt(2), 1>
    }
  finish { Fin }
  }


// macros and declarations for rhombic dodecahedron =====================


// macro to put an object on xy-plane onto a face
// z goes inside, -z goes outside
#macro Put_xy_onto_face ( Object, Rotation )
  object { Object translate -z rotate Rotation }
  #end//macro Put_onto_face


// macro to put an object on xz-plane onto a face
// -y goes inside, y goes outside
#macro Put_xz_onto_face ( Object, Rotation )
  object { Object translate y rotate Rotation-90*x }
  #end//macro Put_onto_face


// macro to create rounded objects for faces
#macro Face ( Round )
  #local X = <1-sqrt(3)*Round, 0>;
  #local Y = <0, (1-sqrt(3)*Round)*sqrt(.5)>;
  union {
    sphere   {-X,    Round }
    cylinder {-X, Y, Round }
    sphere   { Y,    Round }
    cylinder { Y, X, Round }
    sphere   { X,    Round }
    cylinder { X,-Y, Round }
    sphere   {-Y,    Round }
    cylinder {-Y,-X, Round }
    prism { linear_spline -Round, Round, 5, -X, Y, X, -Y, -X
      rotate 90*x
      }
    translate Round*z
    // no "}" to allow application of texture etc.
  #end//macro Face


// some face objects; scale .96 found by experimentation ...
#declare Face1 = Face(.03) scale .96
  texture { Wood1 rotate degrees(atan(sqrt(.5)))*z }
  }

#declare Face2 = Face(.03) scale .96
  texture { Wood2 rotate degrees(atan(sqrt(.5)))*z }
  }

#declare Face3 = Face(.2 ) scale 1
  texture { Wood1 rotate degrees(atan(sqrt(.5)))*z }
  }

#declare Face4 = sphere { z, 1 scale <sqrt(.5), .5, .01> texture { Test } }


#declare RhomDo1 =
  union {
    Put_xy_onto_face ( Face1, <  0, 45, 45> ) // front, lower left
    Put_xy_onto_face ( Face2, <  0, 45,-45> ) // front, upper left
    Put_xy_onto_face ( Face1, <  0,-45, 45> ) // front, upper right
    Put_xy_onto_face ( Face2, <  0,-45,-45> ) // front, lower right
    Put_xy_onto_face ( Face3, <  0,225,-45> ) // back, lower right
    Put_xy_onto_face ( Face4, <  0,225, 45> ) // back, upper right
    Put_xy_onto_face ( Face3, <  0,135,-45> ) // back, upper left
    Put_xy_onto_face ( Face4, <  0,135, 45> ) // back, lower left
    Put_xy_onto_face ( Face1, < 90,  0,  0> ) // top
    Put_xy_onto_face ( Face2, < 90,  0, 90> ) // left
    Put_xy_onto_face ( Face1, < 90,  0,180> ) // bottom
    Put_xy_onto_face ( Face2, < 90,  0,-90> ) // right
    }


#declare RhomDo2 =
  union {
    object { RhomDo1 }
    Put_xz_onto_face ( object { RhomDo1 translate y }, <  0,-45, 45> )
    Put_xz_onto_face ( object { RhomDo1 translate y }, <  0,225, 45> )
    Put_xz_onto_face ( object { RhomDo1 translate y }, <  0,135,-45> )
    }


// simple scene with textured rhombic dodecahedrons etc. on plane =======


object { RhomDo1 scale .5 translate <-1, 0.5, 0> }

object { RhomDo2 scale .5 translate <0.8, 0.5, 1> }

#declare Rand = seed(876);
#declare Snake = RhomDo1;
#declare I = 0;
#while (I<15)
  #declare Snake =
    union {
      // get a new RhomDo
      object { RhomDo1 }
      // put on one of it's upper faces the snake created so far:
      Put_xz_onto_face (
        // get the snake so far (centered around 0)
        object  { Snake
          // put onto xz-plane pointing to y
          translate y },
          // choose one of the upper fife faces
          #switch (rand(Rand))
            #range(0  , .15) <  0, 45,-45> ) #break
            #range(.15, .3 ) <  0,-45, 45> ) #break
            #range(.3 , .45) <  0,225, 45> ) #break
            #range(.45, .6 ) <  0,135,-45> ) #break
            #else            < 90,  0,  0> )
            #end//switch
      }//union
  #declare I = I+1;
  #end//while I

object { Snake translate y scale 0.1 rotate 0*y translate <-0.2, 0, -0.7> }


plane { y, 0
  texture {
    pigment { checker rgb <1, .9, .8>, rgb <.8, .7, .6> }
    finish { Fin }
    }
  }

light_source { <-1500, 2500, -2000>, color rgb 1 }

camera { location -10*z look_at 0 angle 20
  rotate <25, 20, 0> translate <0, 1, 0> }


// END ==================================================================


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.