1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// This work is licensed under the Creative Commons Attribution 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/
// or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View,
// California, 94041, USA.
// Persistence Of Vision raytracer sample file.
//
//=================================================================================
// WICKER WORK with "trace ()".
//=================================================================================
// [Fabien Mosen - August 2001]
//
// -w320 -h240
// -w800 -h600 +a0.3
//This scene demonstrates the use of the "trace" function to create shapes
//that fits irregular shapes. We are going to model a wicker work surrounding
//a bottle, like the old Italian wine bottles.
#version 3.6;
global_settings {assumed_gamma 1.0}
#include "colors.inc"
//=========================================== WAVY RINGS =========================
//A macro to produce the wavy wicker rings
//freq : frequency, amplit : amplitude, phase : phase between -1 et 1 (usually 1)
//radius1 : big radius of ring, radius2 : radius of wicker
//Degree_Resolution : lenght of the little cylinders making the ring
// Updated: 10Aug2008 (jh) for v3.7 distribution
#macro WickerRing (Freq, Amplit, Phase, Radius1, Radius2,Degree_Resolution)
union {
#local P1=<Radius1,0,0>+.0001;
#local Boucle=0;
#while (Boucle < 360)
#local Position = Phase*Amplit*sin(radians(Boucle*Freq));
#local P2 = P1;
#local P1 = vrotate(<Radius1+Position, 0, 0>,y*Boucle);
cylinder {P1,P2, Radius2}
#local Boucle=Boucle+Degree_Resolution;
#end
cylinder {P2,<Radius1,0,0>, Radius2}
}
#end
//=========================================== THE BOTTLE ======================
//This bottle was produced by SpilinEditor, and exported with height normalized
//to 1 unit (which allows easy scaling afterwards).
#declare BottleLathe =
lathe{
cubic_spline
15,
<0.036140,0.004819>,<0.228886,0.036140>,<0.293938,0.279482>,
<0.106010,0.599923>,<0.055415,0.850493>,<0.103601,0.951684>,
<0.072280,0.990234>,<0.038549,0.963731>,<0.062643,0.619197>,
<0.277073,0.257798>,<0.185518,0.038549>,<0.014456,0.060233>,
<0.036140,0.004819>,<0.228886,0.036140>,<0.293938,0.279482>
}
#declare BigBottle = object {
BottleLathe
scale 50
pigment {MediumForestGreen} finish {phong .9}
}
object {BigBottle}
//================================== PLACING THE RINGS ========================
//"scanning" the bottle from bottom to top.
#declare Loop=0; //from 0
#while (Loop < 25) //to 25, wicker stopping at middle height
//but you can change that.
#declare StartTrace = <50,Loop,0>; //50 is the distance for the start of
//the tracing ray. Adjust to your
//bottle's maximum diameter
#declare FoundPoint = trace (BigBottle, StartTrace, <-1,0,0>);
//now, we know the radius of the bottle at a given height.
//then we call the ring macro, using the found radius, with a frequency
//of 20
object {WickerRing (20, .5, 1, 1+FoundPoint.x, .2, 2)
translate y*Loop pigment {rgb <255/255,212/255,117/255>}
finish {phong .5 specular .5}
normal {bumps .2 scale .3}
rotate y*Loop*18 //rotate each time to alternate the rings '
//phases (360/20 = 18)
}
#declare Loop=Loop+.5;
#end
//================================== VERTICAL FIBERS ========================
//creating the vertical fiber passing trough all rings, using the
//same method than previously.
#declare V_Fiber = union {
#declare StartTrace = <50,0,0>;
#declare FoundPoint = trace (BigBottle, StartTrace, <-1,0,0>);
#declare P1=FoundPoint+.0001;
#declare Loop=0;
#while (Loop < 35)
#declare StartTrace = <50,Loop,0>;
#declare FoundPoint = trace (BigBottle, StartTrace, <-1,0,0>);
#declare P2=P1;
#declare P1=FoundPoint+.5;
cylinder {P1,P2,.3}
#declare Loop=Loop+1;
#end
}//end of union
object {BigBottle}
//placing vertical fibers
#declare I=-1;
#while (I < 360)
object {V_Fiber rotate y*I
pigment {rgb <255/255,201/255,107/255>}
finish {phong .5 specular .5}
normal {bumps .2 scale .3}
}
#declare I=I+9;//rotation = 0.5*(rings rotation)
#end
//=========================================== SCENERY =========================
light_source {<100,300,200> White*2}
camera { location <100,100,100>
right x*image_width/image_height
angle 25 // direction z*3
look_at <0,25,0>
}
plane {y,0 pigment {White}}
|