# Tetra_Boy_60deg.slf # Combine four identical Boy surfaces with tetrahedral symmetry into a genus-4 non-orientable surface. # 3/4 square loop profile -- quadrilateral subdivision surface # Use double patches to avoid problems with single-sidedness. ## Try a different rotation of the boy caps to get 3 lobe-arms come together # CHS 2012-11-11 # CHS 2014/08/29 fixing it ##################################################################### tclinit { package require slideui toplevel .slfWindow.ui CreateSLIDESubdivisionObject oSubdivision set widget [CreateSLIDESubdivisionUI .slfWindow.ui oSubdivision] pack $widget toplevel .slfWindow.uiOffset CreateSLIDEOffsetObject oOffset set widget [CreateSLIDEOffsetUI .slfWindow.uiOffset oOffset] pack $widget } tclinit { set winName .slfWindow source SLIDEUI.tcl source MATH.tcl CreateGroupUI $winName gRoot proc CreateBPUI { parent name } { set subname "slf_[subst $name]" if { $parent == {} } { set root .$subname } elseif { $parent == "." } { set root .$subname } else { set root $parent.$subname } toplevel $root set v111 [CreateScale $name $root v111 "v111 " 1.8 1 2 0.001 1 horizontal] set f100 [CreateScale $name $root f100 "f100 " -3.0 -3 3 0.1 1 horizontal] set f011 [CreateScale $name $root f011 "f011 " 0.96 -3 3 0.01 1 horizontal] set shift [CreateScale $name $root shift "shift-outer" -1.6 -4 0 0.1 1 horizontal] set rotax [CreateScale $name $root rotax "rot-on-ax" 60 -60 60 3 1 horizontal] set sep [CreateScale $name $root sep "separation" -3.0 -4 0 0.01 1 horizontal] set rad [CreateScale $name $root rad "sphere-rad" 0.1 0.0 1 0.01 1 horizontal] set ambil [CreateScale $name $root ambil "amb Illum." 0.3 0.1 1 0.1 1 horizontal] set diril [CreateScale $name $root diril "dir Illum." 0.7 0.1 2 0.1 1 horizontal] pack $v111 $f100 $f011 $shift $rotax $sep $rad $ambil $diril -side top -fill x } CreateBPUI $winName bp } ######## GEOMETRY ############### # to mark the tetra corners sphere ball radius {expr $bp_rad} endsphere mesh mPatchA #tetra vertices vertex I1 ( {expr (+0.5)*$bp_v111} {expr (-0.5)*$bp_v111} {expr (-0.5)*$bp_v111} ) endvertex vertex I1_ ( {expr (+0.5)*$bp_v111} {expr (-0.5)*$bp_v111} {expr (-0.5)*$bp_v111} ) endvertex vertex I4 ( {expr (-0.5)*$bp_v111} {expr (-0.5)*$bp_v111} {expr (+0.5)*$bp_v111} ) endvertex vertex I4_ ( {expr (-0.5)*$bp_v111} {expr (-0.5)*$bp_v111} {expr (+0.5)*$bp_v111} ) endvertex vertex L4 ( {expr (-0.5)*$bp_v111} {expr (+0.5)*$bp_v111} {expr (-0.5)*$bp_v111} ) endvertex vertex L4_ ( {expr (-0.5)*$bp_v111} {expr (+0.5)*$bp_v111} {expr (-0.5)*$bp_v111} ) endvertex #cube face centers vertex I0 ( {expr $bp_f011} {expr $bp_f011} {expr $bp_f100} ) endvertex vertex I0_ ( {expr $bp_f011} {expr $bp_f011} {expr $bp_f100} ) endvertex vertex I5 ( {expr $bp_f011} {expr $bp_f100} {expr $bp_f011} ) endvertex vertex I5_ ( {expr $bp_f011} {expr $bp_f100} {expr $bp_f011} ) endvertex vertex O4 ( {expr $bp_f100} {expr $bp_f011} {expr $bp_f011} ) endvertex vertex O4_ ( {expr $bp_f100} {expr $bp_f011} {expr $bp_f011} ) endvertex vertex O2 ( {expr $bp_shift-3} {expr $bp_shift-2} {expr $bp_shift+1} ) endvertex vertex O3 ( {expr $bp_shift-3} {expr $bp_shift+2} {expr $bp_shift+1} ) endvertex vertex O2_ ( {expr $bp_shift-3} {expr $bp_shift-2} {expr $bp_shift+1} ) endvertex vertex O3_ ( {expr $bp_shift-3} {expr $bp_shift+2} {expr $bp_shift+1} ) endvertex vertex L2 ( {expr $bp_shift-3} {expr $bp_shift-2} {expr $bp_shift+0} ) endvertex vertex L2_ ( {expr $bp_shift-3} {expr $bp_shift-2} {expr $bp_shift+0} ) endvertex vertex L3 ( {expr $bp_shift-3} {expr $bp_shift+2} {expr $bp_shift+0} ) endvertex vertex L3_ ( {expr $bp_shift-3} {expr $bp_shift+2} {expr $bp_shift+0} ) endvertex vertex U1 ( {expr $bp_shift+1} {expr $bp_shift-3} {expr $bp_shift+2} ) endvertex vertex U2 ( {expr $bp_shift} {expr $bp_shift-3} {expr $bp_shift+2} ) endvertex vertex U1_ ( {expr $bp_shift+1} {expr $bp_shift-3} {expr $bp_shift+2} ) endvertex vertex U2_ ( {expr $bp_shift} {expr $bp_shift-3} {expr $bp_shift+2} ) endvertex vertex D1 ( {expr $bp_shift+1} {expr $bp_shift-3} {expr $bp_shift-2} ) endvertex vertex D2 ( {expr $bp_shift} {expr $bp_shift-3} {expr $bp_shift-2} ) endvertex vertex D1_ ( {expr $bp_shift+1} {expr $bp_shift-3} {expr $bp_shift-2} ) endvertex vertex D2_ ( {expr $bp_shift} {expr $bp_shift-3} {expr $bp_shift-2} ) endvertex vertex B1 ( {expr $bp_shift+2} {expr $bp_shift+1} {expr $bp_shift-3} ) endvertex vertex B2 ( {expr $bp_shift+2} {expr $bp_shift+0} {expr $bp_shift-3} ) endvertex vertex B3 ( {expr $bp_shift-2} {expr $bp_shift+0} {expr $bp_shift-3} ) endvertex vertex B4 ( {expr $bp_shift-2} {expr $bp_shift+1} {expr $bp_shift-3} ) endvertex vertex B1_ ( {expr $bp_shift+2} {expr $bp_shift+1} {expr $bp_shift-3} ) endvertex vertex B2_ ( {expr $bp_shift+2} {expr $bp_shift+0} {expr $bp_shift-3} ) endvertex vertex B3_ ( {expr $bp_shift-2} {expr $bp_shift+0} {expr $bp_shift-3} ) endvertex vertex B4_ ( {expr $bp_shift-2} {expr $bp_shift+1} {expr $bp_shift-3} ) endvertex vertex I2 ( {expr $bp_shift-2} {expr $bp_shift-0.9} {expr $bp_shift+1} ) endvertex vertex I2_ ( {expr $bp_shift-2} {expr $bp_shift-0.9} {expr $bp_shift+1} ) endvertex vertex L1 ( {expr $bp_shift+1} {expr $bp_shift-2} {expr $bp_shift-0.9}) endvertex vertex L1_ ( {expr $bp_shift+1} {expr $bp_shift-2} {expr $bp_shift-0.9}) endvertex vertex D3 ( {expr $bp_shift-0.9} {expr $bp_shift+1} {expr $bp_shift-2} ) endvertex vertex D3_ ( {expr $bp_shift-0.9} {expr $bp_shift+1} {expr $bp_shift-2} ) endvertex vertex I3 ( {expr $bp_shift-2} {expr $bp_shift+0.2} {expr $bp_shift+1} ) endvertex vertex I3_ ( {expr $bp_shift-2} {expr $bp_shift+0.2} {expr $bp_shift+1} ) endvertex vertex O1 ( {expr $bp_shift+1} {expr $bp_shift-2} {expr $bp_shift+0.2}) endvertex vertex O1_ ( {expr $bp_shift+1} {expr $bp_shift-2} {expr $bp_shift+0.2}) endvertex vertex D4 ( {expr $bp_shift+0.2} {expr $bp_shift+1} {expr $bp_shift-2} ) endvertex vertex D4_ ( {expr $bp_shift+0.2} {expr $bp_shift+1} {expr $bp_shift-2} ) endvertex # {expr $param(i)} ## I tried do do subdivision with only ONE surface -- but SLIDE really wants a closed mesh ! ## facet f0_ ( L1_ L2 L3 L4 ) endfacet facet f1_ ( L1_ O1_ O2 L2 ) endfacet facet f2_ ( L2 O2 O3 L3 ) endfacet facet f3_ ( L3 O3 O4 L4 ) endfacet facet f4_ ( O1_ I1_ I2 O2 ) endfacet facet f5_ ( O2 I2 I3 O3 ) endfacet facet f6_ ( O3 I3 I4 O4 ) endfacet #facet f7_ ( O4 I4 I5 P ) endfacet facet b0_ ( I4 D3_ D2 U2 ) endfacet facet b1_ ( D1 D2 D3_ D4_ ) endfacet facet b2_ ( D2 D1 U1 U2 ) endfacet facet b3_ ( U2 U1 I5 I4 ) endfacet facet b4_ ( D4_ L4_ L1 D1 ) endfacet facet b5_ ( O1 U1 D1 L1 ) endfacet facet b6_ ( U1 O1 I1 I5 ) endfacet #facet b7_ ( I5 I1 I0 P ) endfacet facet c0_ ( B3 B2 I1 I2_ ) endfacet facet c1_ ( I2_ I3_ B4 B3 ) endfacet facet c2_ ( B3 B4 B1 B2 ) endfacet facet c3_ ( B2 B1 I0 I1 ) endfacet facet c4_ ( I3_ I4_ D3 B4 ) endfacet facet c5_ ( B4 D3 D4 B1 ) endfacet facet c6_ ( B1 D4 L4 I0 ) endfacet #facet c7_ ( I0 L4 O4 P ) endfacet ### Opposite orientation, using twin set of points. ### facet f0 ( L2_ L1 L4_ L3_) endfacet facet f1 ( O1 L1 L2_ O2_) endfacet facet f2 ( O2_ L2_ L3_ O3_) endfacet facet f3 ( O3_ L3_ L4_ O4_) endfacet facet f4 ( I1 O1 O2_ I2_) endfacet facet f5 ( I2_ O2_ O3_ I3_) endfacet facet f6 ( I3_ O3_ O4_ I4_) endfacet #facet f7 ( I4_ O4_ P_ I5_) endfacet facet b0 ( D3 I4_ U2_ D2_) endfacet facet b1 ( D2_ D1_ D4 D3) endfacet facet b2 ( D1_ D2_ U2_ U1_) endfacet facet b3 ( U1_ U2_ I4_ I5_) endfacet facet b4 ( L4 D4 D1_ L1_) endfacet facet b5 ( U1_ O1_ L1_ D1_) endfacet facet b6 ( O1_ U1_ I5_ I1_) endfacet #facet b7 ( I1_ I5_ P_ I0_) endfacet facet c0 ( B2_ B3_ I2 I1_) endfacet facet c1 ( I3 I2 B3_ B4_) endfacet facet c2 ( B4_ B3_ B2_ B1_) endfacet facet c3 ( B1_ B2_ I1_ I0_) endfacet facet c4 ( I4 I3 B4_ D3_) endfacet facet c5 ( D3_ B4_ B1_ D4_) endfacet facet c6 ( D4_ B1_ I0_ L4_) endfacet #facet c7 ( L4_ I0_ P_ O4_) endfacet endmesh group oneboy instance mPatchA endinstance # instance ball translate( {expr (+0.5)*$bp_v111} {expr (-0.5)*$bp_v111} {expr (-0.5)*$bp_v111} ) surface WHT endinstance # instance ball translate( {expr (-0.5)*$bp_v111} {expr (-0.5)*$bp_v111} {expr (+0.5)*$bp_v111} ) surface WHT endinstance # instance ball translate( {expr (-0.5)*$bp_v111} {expr (+0.5)*$bp_v111} {expr (-0.5)*$bp_v111} ) surface WHT endinstance endgroup group oneboyplus instance oneboy scale(10 10 10) rotate(1 1 1)({expr $bp_rotax}) translate( {expr $bp_sep} {expr $bp_sep} {expr $bp_sep} ) endinstance endgroup ### Two mirrored Boy-caps make a Klein bottle of type KOJ. ## To make the shape more interesting we rotate the two halves against one another by 60 degrees, ## yielding S6 symmetry. # --> maka a gridded model of this! # TEST FACE point I4 (-0.5 -0.5 0.5 ) endpoint point I5 ( 0.5 -0.5 0.5 ) endpoint point U1 ( 1 -2 2 ) endpoint point U2 ( 0 -2 2 ) endpoint face b3_red ( U2 U1 I5 I4 ) surface R endface object ored (b3_red) endobject ####################################################### subdivision oSubdivisionA lod {expr $oSubdivision(lod)} shading {expr $oSubdivision(shading)} type {expr $oSubdivision(type)} subdivisions {expr $oSubdivision(subdivisions)} errormetric {expr $oSubdivision(errormetric)} drawcontrols {expr $oSubdivision(drawcontrols)} drawcurrent {expr $oSubdivision(drawcurrent)} drawvertices {expr $oSubdivision(drawvertices)} # Hack to get non-uniform knot spacing on some of the edges uknots {expr $oSubdivision(weightededges)} uorder {expr $oSubdivision(weight)} vknots {expr $oSubdivision(a)} vorder {expr $oSubdivision(b)} # Hack to assign a tolerance value for the selective subdivision tolerance {expr $oSubdivision(tolerance)} facetsmax {expr $oSubdivision(facetsmax)} instance oneboyplus surface Y endinstance instance oneboyplus surface G rotate(0 0 1)(180) endinstance instance oneboyplus surface C rotate(0 1 0)(180) endinstance instance oneboyplus surface M rotate(1 0 0)(180) endinstance endsubdivision ####################################################### offset oOffset lod {expr $oOffset(lod)} shading {expr $oOffset(shading)} type {expr $oOffset(type)} height {expr $oOffset(height)} width {expr $oOffset(width)} drawcontrols {expr $oOffset(drawcontrols)} instance oSubdivisionA endinstance endoffset ## Use: height = 0.60 ## Use: width = 0.30 ####################################################### group oMySurface (* instance oneboyplus surface Y endinstance instance oneboyplus surface G rotate(0 0 1)(180) endinstance instance oneboyplus surface C rotate(0 1 0)(180) endinstance instance oneboyplus surface M rotate(1 0 0)(180) endinstance *) # instance oSubdivisionA surface Y endinstance instance oOffset surface WHT endinstance # instance ored endinstance endgroup surface R color ( 1 0 0 ) endsurface surface Y color ( 1 1 0 ) endsurface surface G color ( 0 1 0 ) endsurface surface C color ( 0 1 1 ) endsurface surface B color ( 0 0 1 ) endsurface surface M color ( 1 0 1 ) endsurface surface EGG color ( 0.9 0.9 0.9 ) endsurface surface WHT color ( 1 1 1 ) endsurface ############################################################################## group gWorld #shading { expr $oMySurface(shading) } instance oMySurface scale ( 1.4 1.4 1.4 ) ## >> part top = 6 inches endinstance instance amb id main_amb endinstance instance sun id front_sun rotate (0 1 0) (-30) rotate (0 0 1) (-45) endinstance instance anti_sun id back_sun rotate (1 0 0) (180) rotate (0 1 0) (-30) rotate (0 0 1) (-45) endinstance endgroup group gCam instance cam id iCam translate ( 0.0 0.0 1 ) endinstance endgroup camera cam #projection SLF_PARALLEL projection SLF_PERSPECTIVE frustum ( -0.2 -0.2 -2.0 ) ( 0.2 0.2 -0.01) #frustum ( -0.1 -0.1 -2.0 ) ( 0.1 0.1 -0.01) endcamera (* light amb type SLF_AMBIENT color (0.3 0.3 0.3) endlight light sun type SLF_DIRECTIONAL color (0.7 0.7 0.7) endlight light anti_sun type SLF_DIRECTIONAL color (0.4 0.4 0.4) endlight *) light amb type SLF_AMBIENT color ({expr $bp_ambil} {expr $bp_ambil} {expr $bp_ambil}) endlight light sun type SLF_DIRECTIONAL color ({expr $bp_diril} {expr $bp_diril} {expr $bp_diril}) endlight light anti_sun type SLF_DIRECTIONAL color ({expr $bp_diril} {expr $bp_diril} {expr $bp_diril}) endlight window Window background (0.6 0.7 0.8) endwindow viewport vp Window endviewport render vp gCam.iCam.cam gWorld light gWorld.front_sun.sun light gWorld.back_sun.anti_sun light gWorld.main_amb.amb endrender