Utilisation : Les liens ne sont pas apparents. Pour obtenir des informations sur un mot clé, cliquez-le dans le script !
// Persistence of Vision Raytracer Version 3.5 Scene Description File // File: tracevines.pov // Author: Ron Parker // Description: Algorithm shamelessly lifted from // "Modeling Plants With Environment-Sensitive Automata" // Proceedings of Ausgraph '88, pages 27-33 // by James Arvo and David Kirk #macro Interfere(A, B, Object) #local N = <0, 0, 0>; #local I = trace(Object, A, B-A, N); (vlength(N) & (vlength(I-A)<vlength(B-A))) #end #macro FindTmp(CurPt, Normal, Object, RandSeed) #local More = 1; #local Safety = C3; #local Q = <0, 0, 0>; #while (More & Safety) // select random unit T orthogonal to Normal #local T = <rand(RandSeed)-.5, rand(RandSeed)-.5, rand(RandSeed)-.5>; #local T = T-vdot(T, Normal)*Normal; #if (vlength(T)) #local T = T/vlength(T); #local Safety = Safety-1; #local Q = CurPt + C2 * T; #local More = Interfere(CurPt, Q, Object); #end #end #if (Safety) Q; #else <0, 0, 0>; #end #end #macro Draw(CurPt, NewPt, Normal, NewNormal) union { sphere {CurPt, R1} sphere {NewPt, R1} cylinder {CurPt, NewPt, R1} #local Pr = vcross(NewPt-CurPt, NewNormal); #local Pl = vnormalize(NewPt-CurPt); #local Or = vnormalize(.3*NewNormal+.7*Pl); triangle {NewPt, NewPt+LL*Or, NewPt+.5*LL*Or+.5*LW*Pr translate R1*NewNormal} triangle {NewPt, NewPt+LL*Or, NewPt+.5*LL*Or-.5*LW*Pr translate R1*NewNormal} texture {pigment {color green 1}} } #end #macro Grow(Start, Normal, Object, RandSeed) #local Continue = 1; #while (Continue) #ifndef (Watchdog) #local Watchdog = C8; #else #declare Watchdog = Watchdog - 1; #end #ifndef (Gen) #local Gen = 0; #else #local Gen2 = Gen+1; #local Gen = Gen2; #end #local Continue = 0; #local Branch = 0; #if (Watchdog) #local CurPt = Start + C1 * Normal; #local NewTmp = FindTmp(CurPt, Normal, Object, RandSeed) #if (vlength(NewTmp)) #local Dist = 9999; #local NewRoot = Start; #local NewNormal = Normal; #local NewPt = CurPt; #local Iter = C3; #while (Iter) #local R = <rand(RandSeed)-.5, rand(RandSeed)-.5, rand(RandSeed)-.5>+Bias; #local N = <0, 0, 0>; #local Int = trace(Object, NewTmp, R, N); #if (vlength(N)) #local CurDist = vlength(Int-Start); #local TestPt = Int + C1 * N; #if ((CurDist < Dist) & (CurDist < C4) & !Interfere(CurPt, TestPt, Object)) #local Dist = CurDist; #local NewRoot = Int; #local NewNormal = vnormalize(N); #local NewPt = Int+ C1 * N; #end // if shorter dist #end #local Iter = Iter-1; #end #if (vlength(CurPt-NewPt)) Draw(CurPt, NewPt, Normal, NewNormal) #if (rand(RandSeed) > C5 & Gen < C7) #local Continue = 1; #if (rand(RandSeed)<C6) #local Branch = 1; #end #end // if continue #end // if new point #end // if NewTmp found #end // if watchdog #if (Branch) Grow(NewRoot, NewNormal, Object, RandSeed) #end // if branch #local Start = NewRoot; #local Normal = NewNormal; #end // while continue #end #declare Fence = union { cylinder {-2.2*x, <-2.2, 2, 0>, .2} cylinder {0, <0, 2, 0>, .2} cylinder {2.2*x, <2.2, 2, 0>, .2} cylinder {<2.2, 1.7, 0> <-2.2, 1.7, 0> .1} cylinder {<2.2, 1, 0> <-2.2, 1, 0> .1} plane {y 0 pigment {bozo color_map {[0 rgb <1, .8, .5>][1 rgb <.8, .5, .1>]}}} translate -.02*y texture {pigment {color rgb <.5, .25, .1>}} } #declare C1 = .02; // distance of the vine from the object it grows on #declare C2 = .05; // Approximate step distance #declare C3 = 60; // number of attempts to find a surface to take root #declare C4 = .1; // Maximum jump between roots #declare C5 = .05; // probability of quitting after each generation #declare C6 = .3; // probability of branching after each generation #declare C7 = 150; // absolute maximum generations #declare C8 = 10000; // absolute maximum generations along all branches #declare R1 = .01; // radius of vine #declare LL = .1; // length of leaf #declare LW = .1; // width of leaf #declare Bias = <-.2, .4, 0>; #declare RandSeed = seed(347); #declare Sa = array[12] { <-2, 0, 0>, <-2.4, 0, 0>, <-2.2, 0, .2>, <-2.2, 0,-.2>, // left post <2, 0, 0>, <2.4, 0, 0>, <2.2, 0, .2>, <2.2, 0,-.2>, // right post <-.2, 0, 0>, <.2, 0, 0>, <0, 0, .2>, <0, 0,-.2> // center post } #declare Na = array[12] {x,-x, z,-z,-x, x, z,-z,-x, x, z,-z} #declare Count = 0; #while (Count<12) #debug concat("plant ", str(Count+1, 0, 0), "\n") Grow(Sa[Count], Na[Count], Fence, RandSeed) #declare Count = Count+1; #end object {Fence} light_source {<-20, 20,-20> rgb 1} camera {location <-2, 3,-5> look_at y}
Et voici ce que nous obtenons :
