| 
  | 
Thanks Trevor.  :)
I _almost got it.
Still a bit hairy somewhere.
Here's what I'm trying to get to work:
#version 3.7;
global_settings {assumed_gamma 1.0}
#include "colors.inc"
#include "math.inc"
#include "rand.inc"
#include "textures.inc"
#include "transforms.inc"
#declare Feet = 12;
#declare Phi = (1+sqrt(5))/2;
camera {
 location <0*Feet, 0*Feet, -500*Feet>
 look_at  <0*Feet, 0*Feet, 0>
 right     x*image_width/image_height
 up y
}
light_source {<50*Feet, 5000*Feet, 10000*Feet> Yellow} // Sun
light_source {<-100*Feet, 50*Feet, -300*Feet> White}
sky_sphere{ pigment { gradient <0,1,0>
                      color_map { [0.00 rgb <0.6,0.7,1.0>]
                                  [0.35 rgb <0.0,0.1,0.8>]
                                  [0.65 rgb <0.0,0.1,0.8>]
                                  [1.00 rgb <0.6,0.7,1.0>]
                                }
                      scale 2
                    } // end pigment
          } //end skysphere
//###########################################################################################
#declare DrawingScale = 8*Feet / 25;
#declare ArcHeight = 18*DrawingScale; // measured 18 mm on drawing
#declare ArcLength = 170*DrawingScale; // measured 17 cm (170 mm) on drawing
#declare GlobeRadius = (pow(ArcHeight,2) + pow(ArcLength,2)) / (2*ArcHeight);
#declare Scale = GlobeRadius/Phi;   // radius of sphere
#debug concat( " GlobeRadius = ", str(Scale/12, 3, 2), " feet \n")
//###########################################################################################
#declare TwentyHedron = array [12] {
<0, Phi, -1>,   // Top front    0
<0, Phi,  1>,   // Top Rear     1
<-Phi,  1, 0>,  // Left Top     2
<-Phi, -1, 0>,  // Left bottom  3
<Phi,  1,  0>,  // Right top    4
<Phi, -1,  0>,  // Right bottom 5
<-1, 0, -Phi>,  // Front left   6
< 1, 0, -Phi>,  // Front Right  7
<-1. 0, Phi>,   // Rear left   8
< 1, 0, Phi>,   // Rear right   9
<0, -Phi, -1>,  // bottom front 10
<0, -Phi,  1>,  // bottom rear  11
}
#declare IcosahedralArray = array [20][3] {
 //front top cap
    {TwentyHedron[ 0], TwentyHedron[ 4], TwentyHedron[ 1]},     //          1
    {TwentyHedron[ 0], TwentyHedron[ 7], TwentyHedron[ 4]},     //        /   \
    {TwentyHedron[ 0], TwentyHedron[ 6], TwentyHedron[ 7]},     //       2  0  4
    {TwentyHedron[ 0], TwentyHedron[ 2], TwentyHedron[ 6]},     //       \     /
    {TwentyHedron[ 0], TwentyHedron[ 1], TwentyHedron[ 2]},     //        6---7
    // middle belt
    {TwentyHedron[ 1], TwentyHedron[ 9], TwentyHedron[ 8]},
    {TwentyHedron[ 1], TwentyHedron[ 4], TwentyHedron[ 9]},
    {TwentyHedron[ 4], TwentyHedron[ 5], TwentyHedron[ 9]},
    {TwentyHedron[ 4], TwentyHedron[ 7], TwentyHedron[ 5]},     //
1---4---7---6---2---1
    {TwentyHedron[ 7], TwentyHedron[10], TwentyHedron[ 5]},     //     / \ / \ /
\ / \ / \ /
    {TwentyHedron[ 7], TwentyHedron[ 6], TwentyHedron[10]},     //
8---9---5---10--3---8
    {TwentyHedron[ 6], TwentyHedron[ 3], TwentyHedron[10]},
    {TwentyHedron[ 6], TwentyHedron[ 2], TwentyHedron[ 3]},
    {TwentyHedron[ 2], TwentyHedron[ 8], TwentyHedron[ 3]},
    {TwentyHedron[ 2], TwentyHedron[ 1], TwentyHedron[ 8]},
    //rear bottom cap
    {TwentyHedron[11], TwentyHedron[ 8], TwentyHedron[ 9]},     //        8---9
    {TwentyHedron[11], TwentyHedron[ 9], TwentyHedron[ 5]},     //       /     \
    {TwentyHedron[11], TwentyHedron[ 5], TwentyHedron[10]},     //      3   11
5
    {TwentyHedron[11], TwentyHedron[10], TwentyHedron[ 3]},     //       \     /
    {TwentyHedron[11], TwentyHedron[ 3], TwentyHedron[ 8]}      //          10
}
//
################################################################################################
#macro Subdivision (BasisArray, Iterations)
 //-----------------------------------------------------------------
 //  Subdivision of triangles
 //-----------------------------------------------------------------
 #for (Subdivide, 1, Iterations)
 #local BasisNumber = dimension_size (BasisArray, 1);
 #local ExpandedArray = array [4 * BasisNumber][3];
 //#debug "------------\n"
     #for (BasisTriangle, 0, BasisNumber-1)
 //  Subdivision scheme for triangles
 //           1
 //          / \
 //         A___B
 //        / \ / \
 //       0___C___2
 #local Vertex_A = vnormalize(
(BasisArray[BasisTriangle][0]+BasisArray[BasisTriangle][1])/2 );
 #local Vertex_B = vnormalize(
(BasisArray[BasisTriangle][1]+BasisArray[BasisTriangle][2])/2 );
 #local Vertex_C = vnormalize(
(BasisArray[BasisTriangle][2]+BasisArray[BasisTriangle][0])/2 );
 #local ExpandedArray [(4*BasisTriangle)+0][0] =
vnormalize(BasisArray[BasisTriangle][0]);
 //#local ExpandedArray [(4*BasisTriangle)+0][1] =
(BasisArray[BasisTriangle][0]+BasisArray[BasisTriangle][1])/2;
 #local ExpandedArray [(4*BasisTriangle)+0][1] = Vertex_A;
 //#local ExpandedArray [(4*BasisTriangle)+0][2] =
(BasisArray[BasisTriangle][0]+BasisArray[BasisTriangle][2])/2;
 #local ExpandedArray [(4*BasisTriangle)+0][2] = Vertex_C;
 #local ExpandedArray [(4*BasisTriangle)+1][0] =
vnormalize(BasisArray[BasisTriangle][1]);
 //#local ExpandedArray [(4*BasisTriangle)+1][1] =
(BasisArray[BasisTriangle][1]+BasisArray[BasisTriangle][0])/2;
 #local ExpandedArray [(4*BasisTriangle)+1][1] = Vertex_B;
 //#local ExpandedArray [(4*BasisTriangle)+1][2] =
(BasisArray[BasisTriangle][1]+BasisArray[BasisTriangle][2])/2;
 #local ExpandedArray [(4*BasisTriangle)+1][2] = Vertex_A;
 #local ExpandedArray [(4*BasisTriangle)+2][0] =
vnormalize(BasisArray[BasisTriangle][2]);
 //#local ExpandedArray [(4*BasisTriangle)+2][1] =
(BasisArray[BasisTriangle][2]+BasisArray[BasisTriangle][0])/2;
 #local ExpandedArray [(4*BasisTriangle)+2][1] = Vertex_C;
 //#local ExpandedArray [(4*BasisTriangle)+2][2] =
(BasisArray[BasisTriangle][2]+BasisArray[BasisTriangle][1])/2;
 #local ExpandedArray [(4*BasisTriangle)+2][2] = Vertex_B;
 //#local ExpandedArray [(4*BasisTriangle)+3][0] =
(BasisArray[BasisTriangle][0]+BasisArray[BasisTriangle][1])/2;
 #local ExpandedArray [(4*BasisTriangle)+3][0] = Vertex_A;
 //#local ExpandedArray [(4*BasisTriangle)+3][1] =
(BasisArray[BasisTriangle][1]+BasisArray[BasisTriangle][2])/2;
 #local ExpandedArray [(4*BasisTriangle)+3][1] = Vertex_B;
 //#local ExpandedArray [(4*BasisTriangle)+3][2] =
(BasisArray[BasisTriangle][2]+BasisArray[BasisTriangle][0])/2;
 #local ExpandedArray [(4*BasisTriangle)+3][2] = Vertex_C;
 /*
 #debug concat( "Vertex 0 = ", vstr(3, BasisArray[BasisTriangle][0], ", ", 3,
3), " \n")
 #debug concat( "Vertex 1 = ", vstr(3, BasisArray[BasisTriangle][1], ", ", 3,
3), " \n")
 #debug concat( "Vertex 2 = ", vstr(3, BasisArray[BasisTriangle][2], ", ", 3,
3), " \n")
 #debug concat( "Vertex A = ", vstr(3, Vertex_A, ", ", 3, 3), " \n")
 #debug concat( "Vertex B = ", vstr(3, Vertex_B, ", ", 3, 3), " \n")
 #debug concat( "Vertex C = ", vstr(3, Vertex_C, ", ", 3, 3), " \n")
 #debug "------------\n\n"
 */
 #end // end for BasisTriangle
 #local BasisArray = ExpandedArray;
#end // end for Subdivide
ExpandedArray
#end // end macro subdivision
//
################################################################################################
// Build Globe for Scene
#declare Globe_Array = Subdivision (IcosahedralArray, 4)  //  <=================
perform expansion of icosahedraal basis array
#declare ExpandedNumber = dimension_size (Globe_Array, 1);
 #for (Side, 0, ExpandedNumber-1)
  #for (Vertex, 0, 2)
   #declare Globe_Array[Side][Vertex] = Globe_Array[Side][Vertex] * Scale;
  #end // end for Vertex
 #end // end for Side
#declare Strut = 5;
#declare GlobeColor = pigment {Green*0.5}
//  Cylinder Mesh (as guide) and Struts
#declare MeshSphere_1 =
union {
 #declare LastVertex = <0, 0, 0>;
 #for (Side, 0, ExpandedNumber-1)
     #for (Vertex, 0, 2)
   #declare ThisVertex = Globe_Array[Side][Vertex];
   //#debug concat( "Vertex = ", vstr(3, ExpandedArray[Side][Vertex], ", ", 3,
3), " \n")
   #if (Vertex > 0)
    cylinder {LastVertex, ThisVertex, Strut/4 texture {pigment {GlobeColor}
finish {specular 0.8}} }
    #declare CurrentVector = (ThisVertex - LastVertex);
//--------------------------------------------------------------------------------------------------
      // #declare Vec = Point2 - Point1;       //Direction vector to orient to
      #declare Vec = (ThisVertex - LastVertex);
      #declare StrutLength = vlength(CurrentVector);  //LENGTH OF BOX
    //Twist rotates the box around the long axis first
    #declare Twist = 0;
      //RotZ and RotY reoorient the box to align to the vector
      #if (StrutLength = 0 | Vec.x = 0 | Vec.z = 0)
       // do nothing
      #else
       #declare RotZ = degrees(atan2(Vec.y, vlength(<Vec.x, 0, Vec.z>)));
//ROTATION ABOUT Z-AXIS
       #declare RotY = degrees(atan2(Vec.z, Vec.x));
//ROTATION ABOUT Y-AXIS
     #declare IBeam = union {
      box {<0, -Strut, -Strut/3>, <StrutLength, -Strut*0.9, Strut/3>}
      box {<0, -Strut, -Strut/2>, <StrutLength,  Strut,     Strut/2>}
      box {<0,  Strut, -Strut/3>, <StrutLength,  Strut*0.9, Strut/3>}
      pigment {Red*0.5}
     } // end IBeam
     // sphere {Point1 0.5 pigment {Orange*0.5} }
     // sphere {Point2 0.5 pigment {Violet*0.5} }
     #declare NewIBeam = object {IBeam
      rotate Twist*x
          rotate RotZ*z
          rotate RotY*y
     }
     object {NewIBeam translate ThisVertex}
    #end // end if (atan2 check)
   #end // end if (past 1st triangle point)
   #declare LastVertex = ThisVertex;
  #end // end for Vertex
   cylinder {LastVertex, Globe_Array[Side][0], Strut/4 texture {pigment
{GlobeColor} finish {specular 0.8}} }
   #declare CurrentVector = (Globe_Array[Side][0] - LastVertex);
//--------------------------------------------------------------------------------------------------
    // #declare Vec = Point2 - Point1;       //Direction vector to orient to
    #declare Vec = (ThisVertex - LastVertex);
    #declare StrutLength = vlength(CurrentVector);  //LENGTH OF BOX
   //Twist rotates the box around the long axis first
   #declare Twist = 0;
    //RotZ and RotY reoorient the box to align to the vector
    #if (StrutLength = 0 | Vec.x = 0 | Vec.z = 0)
     // do nothing
    #else
      #declare RotZ = degrees(atan2(Vec.y, vlength(<Vec.x, 0, Vec.z>)));
//ROTATION ABOUT Z-AXIS
      #declare RotY = degrees(atan2(Vec.z, Vec.x));
//ROTATION ABOUT Y-AXIS
    #declare IBeam = union {
     box {<0, -Strut, -Strut/3>, <StrutLength, -Strut*0.9, Strut/3>}
     box {<0, -Strut, -Strut/2>, <StrutLength,  Strut,     Strut/2>}
     box {<0,  Strut, -Strut/3>, <StrutLength,  Strut*0.9, Strut/3>}
     pigment {Red*0.6}
    } // end IBeam
    // sphere {Point1 0.5 pigment {Orange*0.5} }
    // sphere {Point2 0.5 pigment {Violet*0.5} }
    #declare NewIBeam = object {IBeam
     rotate Twist*x
         rotate RotZ*z
         rotate RotY*y
    }
    object {NewIBeam translate ThisVertex}
   #end // end if (atan2 check)
 #end // end for Side
} // end union MeshSphere_1
#declare Globe = union {
 object {MeshSphere_1}   // Struts
 #declare Axes = 12;
 cylinder {<0, 0, 0>, <200*Feet, 0, 0> Axes pigment {Red*0.5}}
 cylinder {<0, 0, 0>, <0, 200*Feet, 0> Axes pigment {Green*0.5}}
 cylinder {<0, 0, 0>, <0, 0, 200*Feet> Axes pigment {Blue*0.5}}
}
object {Globe}
 Post a reply to this message 
 | 
  |