Skip to content

Instantly share code, notes, and snippets.

@qoh
Created August 9, 2014 20:27
Show Gist options
  • Save qoh/e2842add5a3b567de143 to your computer and use it in GitHub Desktop.
Save qoh/e2842add5a3b567de143 to your computer and use it in GitHub Desktop.
function createLightning(%start, %end, %group, %color)
{
if (%color $= "")
%color = "1 0 1";
%normal = vectorNormalize(vectorSub(%end, %start));
%segments = Array::from(Array::from(%start, %end, 1));
%count = 3;
%offset = 0.6 * (vectorDist(%start, %end) / 7);
for (%i = 0; %i < %count; %i++)
{
%oldSegments = %segments.copy();
for (%j = 0; %j < %oldSegments.length; %j++)
{
%segment = %oldSegments.value[%j];
%segments.remove(%segment);
%rand = getRandom() SPC getRandom() SPC getRandom();
%perp = vectorAdd(%rand, vectorScale(%normal, -vectorDot(%normal, %rand)));
%center = vectorScale(vectorAdd(%segment.value[0], %segment.value[1]), 0.5);
%center = vectorAdd(%center, vectorScale(%perp, getScalar() * %offset));
%segments.append(Array::from(%segment.value[0], %center, %segment.value[2]));
%segments.append(Array::from(%center, %segment.value[1], %segment.value[2]));
%diff = vectorSub(%center, %segment.value[0]);
%diff = vectorScale(%diff, 0.7);
if (getRandom() < 0.3)
%segments.append(Array::from(%center, vectorAdd(%center, %diff), %segment.value[2] * 0.6));
}
%oldSegments.delete();
}
if (!isObject(%group))
%group = new SimGroup();
%size = 0.05;
for (%i = %group.getCount(); %i < %segments.length; %i++)
{
%beam = new StaticShape()
{
dataBlock = MineShape;
};
%group.add(%beam);
}
for (%i = %group.getCount() - 1; %i >= %segments.length; %i--)
%group.getObject(%i).delete();
for (%i = 0; %i < %segments.length; %i++)
{
%segment = %segments.value[%i];
%beam = %group.getObject(%i);
%a = %segment.value[0];
%b = %segment.value[1];
%beam.setNodeColor("ALL", %color SPC %segment.value[2]);
%vector = vectorNormalize(vectorSub(%b, %a));
%relative = "1 0 0";
%xyz = vectorNormalize(vectorCross(%relative, %vector));
%u = mACos(vectorDot(%relative, %vector)) * -1;
%beam.setTransform(vectorScale(vectorAdd(%a, %b), 0.5) SPC %xyz SPC %u);
%beam.setScale(vectorDist(%a, %b) * 1 SPC %size SPC %size);
}
%segments.delete();
return %group;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment