Having seen a POVRay description of Indra's Net of Pearls, let's now see if we can simulate reincarnation inside the net. We have available videos by Brian Vanderkolk, who simulated what a perfectly reflecting sphere looks like on the inside, on this page[1]. We use Maple 9 to help us out.
When the author simulated Indra's Net, he used R=π/20 for the spheres' radius, therefore we need to make this assumption first. We also need to simulate in 3d, so we use the "geom3d" package:
> restart;
> with(geom3d):
> _EnvXName := x: _EnvYName := y: _EnvZName := z:
> with(plots):
> R:=Pi/20; #Radius of Indra's Sphere
Now, we need to decide how the observer plunges into the spheres. There are two kinds of paths in Brian's videos:
We start at (0,1/2,-5) and move on a straight line riding the vector (0,1/2,z). Once we determine HOW we should enter the spheres, it's just a matter of choosing the right function to make a plunge into the sphere's entrance point. We want "smooth" camera movement, so the directional derivative of the path function which we choose, has to be equal to the directional derivative of a straight line, i,e, 0, at the initial and final path points. For this, we choose the function, sin(x).
Let's then first form the equation which characterizes the actual plunge into the sphere's entry point:
> eq:=(y-Pi/2)/(z+1)=(Pi/2+Pi/2)/(-1+R); #equation for plunging in left of
sphere
> y:=unapply(solve(eq,y),z);#solve for y
> f:=z->1/4*(sin(y(z))+1); #function of path, left of plunge
> p1:=plot(f(z),z=-1..-R):
> p2:=plot({sqrt(R^2-z^2),-sqrt(R^2-z^2)},z=-R..0,color=red):
> display({p1,p2});
We check the values at the end points, and differentiability:
> f(-1),f(-R); #check values there
1/2, 0
> simplify(subs(z=-1,diff(f(z),z))),simplify(subs(z=-R,diff(f(z),z))); #check
differentiability
0, 0
Now let's check what will be the maximum visual tilt in our path:
> msx:=solve(diff(f(z),z&dolar;2)=0);#find out max tilt angle
> ms:=simplify(subs(z=msx,diff(f(z),z)));
> eq:=(y-f(msx))/(z-msx)=ms;
>y:=unapply(solve(eq,y),z);
> evalf(-Pi/5),evalf(arctan(ms)),evalf(-Pi/4);
-0.6283185308, -0.7500867099, -0.7853981635
The tilt angle is between π/5 and π/4. Let's see the tilt:
> p3:=plot(y(z),z=-1..-R,color=blue):
> p4:=plot(sqrt(R^2-z^2)-1,z=-R..R,color=red):
> display({p1,p2,p3,p4});
This means that at maximum tilt, we are going to be looking roughly at -0.3 on the y-axis. Now, based on the data that Brian published for his off-axis entry, let's calculate the second plunge:
> eq:=(y-Pi/2)/(z+1)=(Pi/2+Pi/2)/(-1+cos(arcsin(R/10))*R); #equation for plunging
left of sphere
> y:=unapply(solve(eq,y),z);
> g:=z->(1/2-R/10)*1/2*(sin(y(z))+1)+R/10; #function of path, left of plunge
> p1:=plot(g(z),z=-1..-R*cos(arcsin(R/10))):
> p2:=plot({sqrt(R^2-z^2),-sqrt(R^2-z^2)},z=-R..0,color=red):
> display({p1,p2});
Let's check some values and differentiability for the off-axis plunge:
> simplify(g(-1)),simplify(g(-R*cos(arcsin(R/10)))); #check values there
1/2, 1/200*Pi
>
simplify(subs(z=-1,diff(g(z),z))),simplify(subs(z=-R*cos(arcsin(R/10)),diff(g(z),z)));
#check differentiability
0, 0
The exit path is going to be symmetric:
> plot(f(-z),z=R..1);#exit path
Now we create the complete on-axis path:
> cpath:=z->piecewise(z<=-1, 1/2, z>-1 and z<=-R, f(z),z>-R and z<R,0,z>=R and z<1,f(-z),z>=1,1/2);#path through center
Check it:
> p1:=plot(cpath(z),z=-2..2):
> p2:=implicitplot(z^2+y^2=R^2,z=-R..R,y=-R..R):
> display({p1,p2});
And the off-axis path:
> spath:=z->piecewise(z<=-1, 1/2, z>-1 and z<=-R*cos(sin(R/10)), g(z),z>-R*cos(sin(R/10)) and z<R*cos(sin(R/10)),R/10,z>=R*cos(sin(R/10)) and z<1,g(-z),z>=1,1/2);#path through offset
> p1:=plot(spath(z),z=-2..2):
> display({p1,p2});
Note the difference between the two paths. Now let's put everything together with geom3d:
> steps:=20;#steps to complete path
> dz:=4/steps; #for cpath
> trajectory:=spath; #can use cpath as well, here
> path:={};
> for i from 0 to steps-1 do
> z1:=-2+i*dz;
> y1:=evalf(trajectory(z1));
> x1:=0;
> z2:=z1+dz;
> y2:=evalf(trajectory(z2));
> x2:=0;
> point(p,x1,y1,z1);
> point(q,x2,y2,z2);
> segment(L,[p,q]);
> path:=path union {draw(L,color=red,labels=[x,y,z])};
> od:
> net:={};
> n:=1;#construct Indra's net
> for k from -n to n do
> for l from -n to n do
> for m from -n to n do
> point(c,[k,l,m]);
> sphere(s,[c,R]);
> net:=net union {draw(s,labels=[x,y,z])};
> od;
> od;
> od;
> reincarnation:=net union path:
> display(reincarnation);
The result is shown on the top figure[1].
POVRay Illustrations of Reincarnation In Indra's Net
A low quality[2] version of the completed video: Trip Through Primordial Chaos This is the complete path of a soul during a virtual reincarnation in Indra's Net, with the entire net and the First Cause visible. The "soul" is incorporeal, so there are no reflections outside Indra's Net, which only reflect themselves and the light of The First Cause. Then the soul takes a plunge into the central Indra sphere, where it incarnates as an iridescent sphere, smaller than the Indra sphere it plunges into. This is necessary, because absent objects inside a perfectly reflecting sphere, there are no reflections. The iridescent-soul-sphere proceeds towards the center of the Indra sphere, makes a stop at r/2, to take a look around for a full 360 degree turn and finally proceeds until it reaches the actual center, where it meets the author, who's creating this very video in POVRay, so the video is self-referential. The soul then leaves the central sphere, travels towards the edge and exits it, returning to Indra's Net. Turning back, a second plunge, this time off-axis, meets the author playing his favorite game against Rex Tremendus. The soul returns to the exact same position where it started, so the entire video is recyclable. The parities of the sub-paths are:
Reincarnation | Direction | On-Axis Entry | Encounters Singularity | Floor Reference |
1 | + | + | +(point) | + |
2 | - | - | +(line) | + |