POV-Ray : Newsgroups : povray.text.tutorials : isomaze tutorial : Re: isomaze tutorial Server Time
15 Jun 2024 10:58:39 EDT (-0400)
  Re: isomaze tutorial  
From: Dennis Milller
Date: 6 Nov 2001 21:55:20
Message: <3be8a298$1@news.povray.org>
Sorry, but this would not render for me. I got an error pointing to the
line:

  function{f_box(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))}


Any ideas?
thanks,
d.


news:is3dutg17gbcfmmh5ij2r05msch59oqus7@4ax.com...
> Here is simple isomaze tutorial for POV 3.5. It is described in 3D. Some
of
> functions (f_torus, f_snoize) are defined in standard include file
> "functions.inc". Sorry for enigmatic sentences but it is my poor English.
I
> expect some isosurface experience from readers :-)
>
> Split 3D space to similiar parts. Simplest part is a box. So, every box
should
> contain the same content but mirrored. And should be smoothly joined by
putting
> connections in the center of the boxes. So, at first lets create simplest
box in
> the center. Centers of the boxes will be joined internally with parts of
> toruses.
>
> <SDL>
>
> #include "stdinc.inc"
>
> #declare Major=.5;
> #declare Minor=.03;
>
> #declare f_torus_1=function{f_torus(x-Major,y,z-Major,Major,Minor)}
> #declare f_torus_2=function{f_torus(x+Major,z,y-Major,Major,Minor)}
> #declare f_torus_3=function{f_torus(y+Major,x,z+Major,Major,Minor)}
>
> #declare
f_part=function{f_torus_1(x,y,z)|f_torus_2(x,y,z)|f_torus_3(x,y,z)}
>
> isosurface{
>   function{f_part(x,y,z)}
>   contained_by{box{-Major Major}}
>   }
>
> </SDL>
>
> Above is base shape. Now we must repeat this in all directions. We can do
it by
> going with all coordinates from any value to <-Major,Major> range. So we
must
> add function for coordinates, increase size of isosurface and change
function.
>
> <SDL>
> #include "stdinc.inc"
>
> #declare Range=3;
> #declare Major=.5;
> #declare Minor=.03;
>
> #declare f_coord=function(coord){coord-(floor(coord)+.5)}
>
> #declare f_torus_1=function{f_torus(x-Major,y,z-Major,Major,Minor)}
> #declare f_torus_2=function{f_torus(x+Major,z,y-Major,Major,Minor)}
> #declare f_torus_3=function{f_torus(y+Major,x,z+Major,Major,Minor)}
>
> #declare
f_part=function{f_torus_1(x,y,z)|f_torus_2(x,y,z)|f_torus_3(x,y,z)}
>
> isosurface{
>   function{f_part(f_coord(x),f_coord(y),f_coord(z))}
>   contained_by{box{-Range Range}}
>   }
> </SDL>
>
> But it is too regular. So let's flip some of the boxes by mirror
coordinates
> around its center. But when and how should be this flipped? Let's control
it by
> noise value for rest of coordinates. To achive constant variation within
whole
> box noise need floor value for coordinates.
>
> <SDL>
> #include "stdinc.inc"
>
> #declare Range=3;
> #declare Major=.5;
> #declare Minor=.03;
>
> #declare f_coord=function(u,v,coord){
>   select(f_snoise3d(10*floor(u),10*floor(v),10*floor(coord)),1,-1)*
>   (coord-(floor(coord)+.5))
> }
>
> #declare f_x=function{f_coord(z,y,x)}
> #declare f_y=function{f_coord(x,z,y)}
> #declare f_z=function{f_coord(y,x,z)}
>
> #declare f_torus_1=function{f_torus(x-Major,y,z-Major,Major,Minor)}
> #declare f_torus_2=function{f_torus(x+Major,z,y-Major,Major,Minor)}
> #declare f_torus_3=function{f_torus(y+Major,x,z+Major,Major,Minor)}
>
> #declare
f_part=function{f_torus_1(x,y,z)|f_torus_2(x,y,z)|f_torus_3(x,y,z)}
>
> isosurface{
>   function{f_part(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))}
>   contained_by{box{-Range Range}}
>   }
> </SDL>
>
> Shape is ready. Now pattern for pigment. At first let's create base 2D
pattern
> within area <0,0><1,1> For smooth results it should be tileable. I choosed
> checkered pattern scaled down to achive equal "squares".
>
> <SDL>
>
> // calc number of rects along x per visible part of torus
> #declare YS=8;
> #declare XS=int(.25*YS*Major/Minor); // visible part
> #declare XS=4*(XS/2=int(XS/2)?XS:XS+1); // whole torus
>
> #declare Pig=pigment{
>   checker
>   color rgb 0 color rgb 1
>   rotate 45*z
>   scale 1/sqrt(2)
>   translate -.5
>   scale <1,.5,1>
>   scale <1/XS,1/YS,1>
> }
>
> </SDL
>
> Now we have to apply this texture to every part of toruses in base box.
>
> <SDL>
> #declare Pig1=pigment{
>   Pig
>   warp{toroidal major_radius Major}
>   translate (x+z)*Major
> }
>
> #declare Pig2=pigment{
>   Pig1
>   matrix<-1,0,0,0,0,1,0,1,0,0,0,0>
> }
>
> #declare Pig3=pigment{
>   Pig1
>   matrix<0,-1,0,1,0,0,0,0,-1,0,0,0>
> }
>
> #declare f_Pig1=function{pigment{Pig1}} // for torus_1
> #declare f_Pig2=function{pigment{Pig2}} // for torus_2
> #declare f_Pig3=function{pigment{Pig3}} // for torus_3
>
> </SDL>
>
> And now hardest thing: We have to choose what pigment should we apply. We
can
> use the same functions as for isosurface. We have to choose one with
smalest
> value.
>
> <SDL>
>
> #declare f_Pig=function{
>
>
select(f_torus_1(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-f_torus_2(f_x(x,y,z),f_y(
x,y,z),f_z(x,y,z)),
>
>
select(f_torus_1(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-f_torus_3(f_x(x,y,z),f_y(
x,y,z),f_z(x,y,z)),
>         f_Pig1(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray,
>         f_Pig3(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray
>       ),
>
>
select(f_torus_2(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-f_torus_3(f_x(x,y,z),f_y(
x,y,z),f_z(x,y,z)),
>         f_Pig2(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray,
>         f_Pig3(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray
>       )
>     )
>   }
>
> </SDL>
>
> finally we can apply pigment to the isosurface
>
> <SDL>
> isosurface{
>   function{f_box(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))}
>   contained_by{box{-Range Range}}
>   pigment{function{f_Pig(x,y,z)}}
> }
> </SDL>
>
> at last we can add a little turbulence to pigments, add turbulenced
pigment as
> modifier to isosurface function and extend base pigment with gradient.
Here is
> whole scene with fog and other things.
>
> <SDL>
> #version 3.5;
>
> #include "stdinc.inc"
>
> global_settings
> {
>   assumed_gamma 1.0
>   noise_generator 2
> }
>
> #declare N=20;
>
> #local Loc=<0, 0, 0>;
> #local Look=Loc+z;
> #local Dir=1.5*z;
> #local Right=x*image_width/image_height;
> #local Angle=15;
>
> camera {
>   perspective
>   location  Loc
>   up        y
>   right     Right
>   look_at   Look
>   angle     Angle
> }
>
> light_source {<-30, 30, -30> color rgb 1 shadowless}
>
> #declare Major=.5;
> #declare Minor=.03;
> #declare YS=8;
> #declare XS=int(.25*YS*Major/Minor);
> #declare XS=4*(XS/2=int(XS/2)?XS:XS+1);
>
> #declare f_torus_1=function{f_torus(x-Major,y,z-Major,Major,Minor)}
> #declare f_torus_2=function{f_torus(x+Major,z,y-Major,Major,Minor)}
> #declare f_torus_3=function{f_torus(y+Major,x,z+Major,Major,Minor)}
>
> #declare PigA=function{pigment{
>   gradient x
>   color_map{
>     [0 color rgb 0]
>     [.5 color rgb 1]
>     [1 color rgb 0]
>   }
> }}
>
> #declare PigB=function{pigment{
>   gradient y
>   pigment_map{
>     [0 color rgb 0]
>     [.5 color rgb 1]
>     [1 color rgb 0]
>   }
> }}
>
> #declare PigC=pigment{function{min(PigA(x,y,z).gray,PigB(x,y,z).gray)}}
> #declare PigD=pigment{color rgb 0}
>
> #declare Pig1=pigment{
>   checker
>   pigment{PigC} pigment{PigD}
>   rotate 45*z
>   scale 1/sqrt(2)
>   translate -.5
>   scale <1,.5,1>
>   scale <1/XS,1/YS,1>
>   warp{toroidal major_radius Major}
>   translate (x+z)*Major
> }
>
> #declare Pig2=pigment{
>   Pig1
>   matrix<-1,0,0,0,0,1,0,1,0,0,0,0>
> }
>
> #declare Pig3=pigment{
>   Pig1
>   matrix<0,-1,0,1,0,0,0,0,-1,0,0,0>
> }
>
> #declare f_Pig1=function{pigment{Pig1}}
> #declare f_Pig2=function{pigment{Pig2}}
> #declare f_Pig3=function{pigment{Pig3}}
>
> #declare
f_box=function{f_torus_1(x,y,z)|f_torus_2(x,y,z)|f_torus_3(x,y,z)}
>
> #declare
>
f_coord=function{select(f_snoise3d(10*floor(x),10*floor(y),10*floor(z)),1,-1
)*(z-(floor(z)+.5))}
>
> #declare f_x=function{f_coord(z,y,x)}
> #declare f_y=function{f_coord(x,z,y)}
> #declare f_z=function{f_coord(y,x,z)}
>
> #declare f_Pig=function{
>
>
select(f_torus_1(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-f_torus_2(f_x(x,y,z),f_y(
x,y,z),f_z(x,y,z)),
>
>
select(f_torus_1(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-f_torus_3(f_x(x,y,z),f_y(
x,y,z),f_z(x,y,z)),
>         f_Pig1(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray,
>         f_Pig3(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray
>       ),
>
>
select(f_torus_2(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-f_torus_3(f_x(x,y,z),f_y(
x,y,z),f_z(x,y,z)),
>         f_Pig2(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray,
>         f_Pig3(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z)).gray
>       )
>     )
>   }
>
> #declare f_Pig_Turb=function{pigment{function{f_Pig(x,y,z)}turbulence
2*Minor}}
>
> isosurface{
>
>
function{f_box(f_x(x,y,z),f_y(x,y,z),f_z(x,y,z))-Minor*f_Pig_Turb(x,y,z).gra
y/4}
>   contained_by{box{-N N}}
>   pigment{
>     function{f_Pig(x,y,z)}
>     color_map{
>       [0 ForestGreen]
>       [1 GreenYellow]
>     }
>   }
>   rotate <20,30,40>
>   #if(clock_on)
>     rotate<
>       Interpolate(frame_number,initial_frame,final_frame,0,360,0)
>       ,
>       Interpolate(frame_number,initial_frame,final_frame,0,360,1)
>       ,
>       Interpolate(frame_number,initial_frame,final_frame,0,360,2)
>     >
>   #end
> }
>
> background{color GreenYellow/2}
>
> fog {
>   distance N
>   color GreenYellow/2
> }
> </SDL>
>
> I wait for large renders and amazing animations :-)
>
> ABX
> --
> #declare _=function(a,b,x){((a^2)+(b^2))^.5-x}#default {pigment{color rgb
1}}
> union{plane{y,-3}plane{-x,-3}finish{reflection 1 ambient
}}isosurface{ file://ABX
>
function{_(x-2,y,1)|_((x+y)*.7,z,.1)|_((x+y+2)*.7,z,.1)|_(x/2+y*.8+1.5,z,.1)
}
> contained_by{box{<0,-3,-.1>,<3,0,.1>}}translate z*15finish{ambient
1}}//POV35


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.