Beschreibungen und Beispiele zum Raytracer POV-Ray von Friedrich A. Lohmüller
    POV-Ray Beispiele - Die Erstellung von Objekten für POV-Ray
English English English
Italiano Italiano
Français français

Home
- POV-Ray Tutorial

  - POV-Ray Beispiele
     Inhaltsübersicht
  - Geometrie
  - Architektur
  - Technik
    - Leiter
    - Masten
    - Geländer
    - Brücke
    - Röhren
    - Rohr-Abzweigung
    - Rohr-Absperrhahn
    - Kette
    - Drahtspule
    - Torpedo
    - Cruise Missile
    - Rakete
    - Rad
    - Truck
    - Propeller
    - Flugzeug
    - Kanu
    - Gitarrenbody
    - 7-Segment Display
    - Flachbandkabel
    - Kabelbaum
                                       
 
Tube fork

Rohr-Abzweigung

Objekte: isosurface, cylinder.
Methoden: #declare, #local, #macro, union, difference.
Die Grundforn einer Rohrverzweigung zum Verbinden von Pipelines, für einen Wasserhahn oder für einen Absperrhahn.

Wir betrachten zunächst zwei blob-ähnliche Isosurfaces. (Äquipotentialflächen)
Die Abmessungen für beide:
#local R1 = 0.50; // tube radius
#local R2 = 0.35; // blob sphere radius
#local Box_L = 4*R1; // size of container box     
#local Bloby = 0.15, // the blob factor
First an isosurface tube with spherical blob:
isosurface{ //-----------------------------------
function{ (1+Bloby)
           - pow( Bloby,(sqrt(x*x+y*y)-(R1)))
           - pow( Bloby,(sqrt(y*y+z*z+x*x)-(R2)))
        } // end function
 contained_by{
  box{<-Box_L,-Box_L,-Box_L>,<Box_L,Box_L,Box_L>}}
 accuracy 0.001
 max_gradient 7
 texture{ pigment{ color rgb<0.45,1,0>}
          finish { phong 1 reflection 0.10}}
} // end of isosurface --------------------------
nuts
Ein Isosurface-Rohr mit einem kubelförmigen Blob.
Dann ein Isosurface aus sich kreuzenden Röhren:
isosurface{ //-----------------------------------
 function{ (1+Bloby)
            - pow( Bloby,(sqrt(x*x+y*y)-(R1)))
            - pow( Bloby,(sqrt(y*y+z*z)-(R2)))
         } // end function
 contained_by{
  box{<-Box_L,-Box_L,-Box_L>,<Box_L,Box_L,Box_L>}}
 accuracy 0.001
 max_gradient 7
 texture{ pigment{ color rgb<1,0.7,0>}
          finish { phong 1 reflection 0.10}}
} // end of isosurface --------------------------
cross
Ein Isosurface aus sich kreuzenden Röhren.

Wie man eine Rohr-Abzweigung machen kann:
Hierbei schränken wir bei jedem der beiden Isosurfaces ihre Containerbox auf jeweils verschieden Hälften ein und dann addieren wir sie zusammen unter Verwendung von "union".
union{
isosurface{ //-----------------------------------
function{ (1+Bloby)
           - pow( Bloby,(sqrt(x*x+y*y)-(R1)))
           - pow( Bloby,(sqrt(y*y+z*z+x*x)-(R2)))
        } // end function
 contained_by{
  box{<-Box_L,-Box_L,-Box_L>,<0,Box_L,Box_L>}}
 accuracy 0.001
 max_gradient 7
 texture{ pigment{ color rgb<0.45,1,0>}
          finish { phong 1 reflection 0.10}}
} // end of isosurface 1 ------------------------

 function{ (1+Bloby)
            - pow( Bloby,(sqrt(x*x+y*y)-(R1)))
            - pow( Bloby,(sqrt(y*y+z*z)-(R2)))
         } // end function
 contained_by{
  box{<0,-Box_L,-Box_L>,<Box_L,Box_L,Box_L>}}
 accuracy 0.001
 max_gradient 7
 texture{ pigment{ color rgb<1,0.7,0>}
          finish { phong 1 reflection 0.10}}
} // end of isosurface 2 ------------------------

} // end of union
cross
Two half isosurface shapes.
cross
The isosurface of forked tube.

Anpassung der Rohr-Abzeigung zum Verbinden mit anderen Rohren:
Weil Isosurface-Formen dieser Art nicht genau den Radius R1 bzw. R2 an den Grenzen ihrer Containerboxen haben muß man einen Korrekturwert zum jeweiligen Radius hinzuaddieren.
(Dieser ist nicht exakt berechnet - man verwendet hier am bestem die Methode von "Versuch und Irrtum"!)
Anmerkung: Wenn man die Rohrradien verändert, dann wird man
diesen Korrekturwert entsprechend anpassen müssen!


Um die Anpassung der Radien des Isosurfaces an externe Rohrradien zu erleichtern sind hier Test-Zylindern zusätzlich ein- und ausschaltbar (Test_Cylinders_ON = 1 oder 0) hinzugefügt.
#local Cor = 0.06; isosuface radius correction
#local Test_Cylinders_ON = 1; // 1 = on; 0 = off
//-----------------------------------------------
union{
isosurface{ //-----------------------------------
 function{ (1+Bloby)
       - pow( Bloby,(sqrt(x*x+y*y)-(R1+Cor)))
       - pow( Bloby,(sqrt(y*y+z*z+x*x)-(R2+Cor)))
         } // end function
 contained_by{
  box{<-Box_L,-Box_L,-Box_L>,<0,Box_L,Box_L>}}
 accuracy 0.001
 max_gradient 7
 texture{ pigment{ color rgb<0.45,1,0>}
          finish { phong 1 reflection 0.10}}
} // end of isosurface 1 ------------------------

 function{ (1+Bloby)
           - pow( Bloby,(sqrt(x*x+y*y)-(R1+Cor)))
           - pow( Bloby,(sqrt(y*y+z*z)-(R2+Cor)))
         } // end function
 contained_by{
  box{<0,-Box_L,-Box_L>,<Box_L,Box_L,Box_L>}}
 accuracy 0.001
 max_gradient 7
 texture{ pigment{ color rgb<1,0.7,0>}
          finish { phong 1 reflection 0.10}}
} // end of isosurface 2 ------------------------
// ----------------------------------------------
#if(Test_Cylinders_ON=1)
 union{ // test
  cylinder{<0,0,Box_L>,<0,0,Box_L+0.5*R1>,R1}
  cylinder{<0,0,-Box_L-0.5*R1>,<0,0,-Box_L>,R1}
  cylinder{<Box_L,0,0>,<Box_L+0.5*R1,0,0>,R2}
  texture{  pigment{ color rgb<1,0.7,0>} }
 } // end of union 'test'
#end // of Test_Cylinders_ON
} // end of union -------------------------------











tube fork with test cylinders
Die Rohr-Abzweigung mit Test-Zylindern

Aushöhlen des Innern und Einfügen des ganzen in ein Makro
vervollständigt die Rohr-Abzweigung:
Das Makro "Tube_Fork_000":
//---------------------------------------------
#macro Tube_Fork_000 (
    R1, // ~0.50,
    R2, // ~0.35 ~0.65,
    Tube_D, // ~0.05, tube material thickness
    Bloby, // blob factor, // 0.1~0.002,
    Cor, //   radius correction,
    Test_Cylinders_ON, // on = 1; off = 0,
  ) // ----------------------------------------
//---------------------------------------------
#local D = 0.0001; // just a little bit !!!
#local Box_L = 4*R1;
//---------------------------------------------
//------------- default textures --------------
#ifndef (Slide_Body_Texture)
#declare Slide_Body_Texture =
 texture{ pigment{ color rgb<1,1,1>*0.85}
          normal { bumps 0.05 scale 0.3005}
          finish { phong 0.7 reflection 0.05}}
#end
#ifndef (Slide_Inside_Texture)
#declare Slide_Inside_Texture =
 texture{ pigment{ color rgb<1,1,1>*0.7}}
#end
#ifndef (Test_Tube_Texture)
#declare Test_Tube_Texture =
  texture { pigment { color rgb<0.7,0.3,1>}}
#end
//-----------....----------- main part --------
union{ // main union

#if(Test_Cylinders_ON=1)
union{ // 1
#end

difference{
 union{
 isosurface{ //--------------------------------
  function{
    (1+Bloby)
    - pow( Bloby, ( sqrt(x*x+y*y)-(R1+Cor) ) )
    - pow( Bloby,( sqrt( y*y+z*z)-(R2+Cor) ) )
  }// end function
  contained_by{
   box{<0,-Box_L,-Box_L>,<Box_L,Box_L,Box_L>} }
  accuracy 0.001
  max_gradient 7
 } // end of isosurface -----------------------

 isosurface{ //--------------------------------
  function{
    (1+Bloby)
    - pow( Bloby, ( sqrt(x*x+y*y)-(R1+Cor) ) )
    - pow( Bloby,( sqrt(y*y+z*z +x*x)-(R2+Cor) ) )
  }// end function
  contained_by{
   box{<-Box_L,-Box_L,-Box_L>,<0,Box_L,Box_L>}}
  accuracy 0.001
  max_gradient 7
 } // end of isosurface -----------------------

 texture{Slide_Body_Texture}
 }// end of union

 cylinder{ <0,0,-Box_L-D>,<0,0,Box_L+D>,R1-Tube_D
           texture{ Slide_Inside_Texture }}
 cylinder{ <0,0,0>,<Box_L+D,0,0>, R2-Tube_D
           texture{ Slide_Inside_Texture }}
}//end of difference  //

#if(Test_Cylinders_ON=1)
 union{ // 'test'
  cylinder{<0,0, Box_L>,<0,0,Box_L+0.5*R1>, R1}
  cylinder{<0,0,-Box_L-0.5*R1>,<0,0,-Box_L>,R1}
  cylinder{<Box_L,0,0>,<Box_L+0.5*R1,0,0>,  R2}
  texture { Test_Tube_Texture }}
 }// end union 'test'
} // end union of '#if(Test_Cylinders_ON = 1)'
#end // Test_Cylinders_ON=1
// ---------

} // end union main
#end // -------------------------- end of macro

Und hier ist ein einfaches Muster dafür wie man dieses Makro verwendet:
// -------------------------- optional textures  
#declare Slide_Body_Texture =
  texture{ pigment{ color rgb<0.75,1,0>}
           finish { phong 1 reflection 0.1}}
#declare Slide_Inside_Texture =
  texture{ pigment{ color rgb<0.3,0.7,0>*1.1}
           finish { phong 1}}
#declare Test_Tube_Texture =
  texture{ pigment { color rgb<1,0.7,0>}
         } // end of texture
// ----------------------------------------------
object{
  Tube_Fork_000 (
  // total container box length = 4*R1
  0.50, // R1, // main tube radius:  1 ~ 0.25
  0.35, // R2, // side tube radius:  1.5 ~ 0.20
  0.05, // Tube_D, // tube material thickness
  0.15, // Blobfactor; // 0.1~0.002 ; max~0.2!!
  0.06, // radius correction, ~ 0.06
  0, // Test_cylinders_ON;  on = 1; off = 0
  ) // ------------------------------------------
  // rotate <0,0,90>
  translate <0,0,0>
} // -------------------------------------------- 



tube fork macro
The tube fork macro.
Szenenbeschreibung für POV-Ray:
"Tube_Fork_000_6.txt" oder "Tube_Fork_000_6.pov"


tube fork macro
Das Tube_Fork-Makro
mit R1 = 0.35, R2 = 0.50,
und rotate<0,0,90>.










































Tube Fork


Zum Download dieser Form als ein Gebrauchsfertige POV-Ray-Objekte
in einer Include-Datei als Makro
und zu Beispiel-Dateien siehe hier:
POV-Ray-Objekte - Röhre
 
top

© Friedrich A. Lohmüller, 2009
www.f-lohmueller.de