File: trace-wicker.pov

package info (click to toggle)
povray 1%3A3.7.0.8-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 146,780 kB
  • sloc: cpp: 845,005; ansic: 122,118; sh: 34,206; pascal: 6,420; asm: 3,355; ada: 1,681; makefile: 1,387; cs: 879; awk: 590; perl: 245; xml: 95
file content (138 lines) | stat: -rw-r--r-- 4,800 bytes parent folder | download | duplicates (7)
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}}