4.1.22 Script gaussianblob

Utilisation : Les liens ne sont pas apparents. Pour obtenir des informations sur un mot clé, cliquez-le dans le script !

// Demo scene for povray 3.5
// Features Gaussian distribution and use of trace function
// Composed by Greg M. Johnson 2001
// Uses a macro by Rico Reusser.

#declare UseRadiosity = no;
#declare S = seed (20173);
seed CompRadius = 0.05;	//radius of blob components;
seed CompNum = 7500;	//number of blob components

#include "colors.inc"
#if (UseRadiosity)
	global_settings {
		radiosity {
			pretrace_start 0.04
			pretrace_end 2/300
			count 400
			recursion_limit 2
			nearest_count 1
			error_bound 0.2
		}
	}
	#default {finish {ambient 0}}
#else
	light_source {<0, 200,-100> color rgb 1.5}
#end

//This macro created by Rico Reusser "reu1000@chorus.net"
#declare e = 2.718281828459;
#macro Gauss (RSR)
	sqrt (-2*log (rand (RSR))/log (e))*cos (2*pi*rand (RSR))
#end

plane {y,-0.9105 pigment {White}}

#declare Norm = <0, 0, 0>;	//This variable is used to hold the normal vector obtained
//using trace(). This vector is then used to determine whether an intersection was found.
#declare Posy = array[CompNum]
#declare Posy[0] = <Gauss (S), 0, Gauss (S)>;
#declare Ally = sphere {Posy[0], CompRadius}	//This variable will hold a collection of spheres,
//one for each blob component. The algorithm checks against this object to decide
//if a component is "on top of" another.

#declare N = 1;
#while (N<CompNum)
	#declare Test = <Gauss (S), 0, Gauss (S)>;
	#declare Tracey = trace (Ally, Test+100*y,-y, Norm);
	#if (Norm.x = 0 & Norm.y = 0 & Norm.z = 0)
		#declare Posy[N] = Test;
		//put the new component at y=0
	#else
		#declare Posy[N] = Tracey+Norm*CompRadius;
		//put the new component at a point "above" the one it hit
		//The algorithm actually uses the normal to compute the position
	#end
	//Add new sphere to union
	#declare Ally =
	union {object {Ally}
		sphere {Posy[N], CompRadius}
	}
//	#debug concat (str (N, 4, 0), "\n")
	#declare N = N+1;
#end

blob {
	threshold 0.5
	#declare N = 0;
	#while (N<CompNum)
		sphere {Posy[N], CompRadius*2.85, 1}
		#declare N = N+1;
	#end
	pigment {rgb <0.2, 1, 0.1>}
}

background {White}

sphere {<0.5, 0, 0>, 0.5
	inverse
	pigment {
		gradient x
		pigment_map {
			[0.0 rgb 0]
			[0.995 rgb 0.04]
			[1.0 rgb 2]
		}
	}
	finish {ambient 20}
	translate <-0.5, 0, 0>
	scale 500
}

camera {
	location <0, 3,-15>
	look_at <0, 0, 0>
	angle 20
}

Et voici ce que nous obtenons :

Et maintenant, vous pouvez voir les différences entre ce résultat et celui avec UseRadiosity et revenir à ce premier.

Retour Retour