Home

When looking for creating an electric arc in POVRAY, I stumbled upon Rune's Electricity Include File. However, it used elements found only in MegaPov. This is my adaptation for use in regular old POVray.

#macro ElectricPath(V)  LinearPath( <1,0,0>, <-1,0,0>, V ) #end
#macro ElectricColor(V) <0.4,0.7,1> #end

// The output is a point that moves from PointA to PointB
// as Value goes from 0.0 to 1.0
#macro LinearPath (PointA,PointB,Value)
  (PointA*(1-Value)+PointB*Value)
#end

// The output is a color vector that changes from ColorA to Color B
// as Value goes from 0.0 to 1.0
#macro LinearColor (ColorA,ColorB,Value)
  (
    vnormalize( ColorA*(1-Value) + ColorB*Value )
    *( vlength(ColorA)*(1-Value) + vlength(ColorB)*Value )
  )
#end

// This is the Electric macro. It calls the internal _Electric macro
// specified further down.
#macro Electric(Brightness,Thickness,Fuzzyness,RollSpeed,FlickerSpeed,MinDist)
  union{
    _Electric(0,1,ElectricPath(0),ElectricPath(1),1,-((ElectricPath(0))+(ElectricPath(1)))*100)
  }
#end

// This macro is used internally only.
// The user do not need to call this macro.
#macro _Electric(ValueA,ValueB,PointA,PointB,Level,Offset)
  #local ValueM = (ValueA+ValueB)/2;
  #local FlickerClock = int((clock*FlickerSpeed+vturbulence(0,0,0,Offset+FlickerSpeed*z*clock).y));
  #local Turbulence = vturbulence(0,0,0,Offset-<100*FlickerClock,RollSpeed*clock,0>);
  #local PointM = (
    (PointA+PointB)/2
    +(ElectricPath(ValueM))-((ElectricPath(ValueA))+(ElectricPath(ValueB)))/2
    +Turbulence*vlength(PointA-PointB)*Fuzzyness
  );
  #local TempColor = (ElectricColor(ValueM)*Brightness);
  light_source { PointM, rgb TempColor*(Thickness/10) }
  sphere{ PointM, Thickness/2 no_shadow pigment{ rgb TempColor*5 } }
  #if (vlength(PointA-PointM)>MinDist) _Electric(ValueA,ValueM,PointA,PointM,Level+1,Offset+pow(3,Level)*x) #end
  #if (vlength(PointB-PointM)>MinDist) _Electric(ValueB,ValueM,PointB,PointM,Level+1,Offset+pow(3,Level)*y) #end
#end
This is the include file in action:
camera { location -50*z look_at 0 }
light_source { <1,3,-2>*1000, rgb 1}

union {
  sphere {<20,12,0>, 2}
  cylinder {<20,-100,0>, <20,12,0>, 1}
  pigment {color rgb 0.8}
  finish {brilliance 2 reflection 0.5}
}

union {
  sphere {<-20,12,0>, 2}
  cylinder {<-20,-100,0>, <-20,12,0>, 1}
  pigment {color rgb 0.8}
  finish {brilliance 2 reflection 0.5}
}

#include "electric.inc"
#macro ElectricPath(V)  LinearPath( <-18,12,0>, <18,12,0>, V ) #end
#macro ElectricColor(V) <0.4,0.7,1.0> #end // This is optional: it's default
//       Brightness,Thickness,Fuzzyness,RollSpeed,FlickerSpeed,MinDist
Electric( 0.3      , 0.2     , 0.5     , 0       , 0          , 0.1   )

Hosted by www.Geocities.ws

1