Modelling Prehistoric Life

This interpolating function generates the shape of the curve to be used for the fins.

fun=Interpolation[{{0,0.2},{0.6,0.35},{0.75,0.35},{0.9,0.25},{0.95,0.15},{1,.01}},InterpolationOrder->2];

Here's the front edge in 2D.

front=Table[{x,fun[x]},{x,0,1,.01}];

This mirrors the frontedge to make the backedge, removing the pivot point in the process and joins the points together.

flatpoly=Join[front,Drop[Reverse[front],{-1}]/.{x_,y_}->{x,-y}];

This creates the top 3D polygon vertices resulting in a polygon tilted in the y-direction.

toppoly=flatpoly/.{x_,y_}->{x,y,.5 (.025+y)};

This creates the bottom 3D polygon.

bottompoly=toppoly/.{x_,y_,z_}->{x,y,z-.025};

Because the fins need to "flap", and to prevent non-planar polygons later, we use some code to break up the fin polygon into triangles that can be transformed more easily without distortion.

MyTriangles[pts_]:=Module[{c=Total[pts]/Length[pts]},Table[{c,pts[[i]],pts[[Mod[i+1,Length[pts],1]]]},{i,Length[pts]}]];

topfin=MyTriangles[flatpoly];

This transforms the 2D polygon into a 3D polygon that it tilted slightly in the y-direction.  This allows the fins to overlap without intersecting all of the time.

topside=topfin/.{x_,y_}->{x,y,.5 (.025+y)};

This creates the bottom of the side-fins.

bottomside=topside/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{x,y,z-.025};

This fills in the gap between the top and bottom of the fins.

sides=Table[{toppoly[[i]],toppoly[[i+1]],bottompoly[[i+1]],bottompoly[[i]],toppoly[[i]]},{i,1,Length[topfin]-1}];

Now, we convert the vertices into polygons and create a fin that can be translated in x, y, and z.

fin[x_,y_,z_]:=Graphics3D[{EdgeForm[],Orange,Polygon[sides],Polygon[topside],Polygon[bottomside]},Axes->True,ImageSize->400]/.{oldx_?NumberQ,oldy_?NumberQ,oldz_?NumberQ}:>{oldx+x,oldy+y,oldz+z}

Here is what a single fin looks like.

fin[0,10,0]

Here we define an ellipsoid to be used to model the head of Anomalocaris.

polyEllipsoid[a_,b_,c_,{x_,y_,z_}]:={a Cos[θ]Sin[ϕ]+x,b Sin[θ]Sin[ϕ]+y,c Cos[ϕ]+z}

The mouth is modelled using ParametricPlot3D.

mouth=Show[ParametricPlot3D[{r Cos[t],r Sin[t]+2.75,-.43},{r,.1,.25},{t,0,2 π},PlotStyle->{Orange},MeshFunctions->{#5&},Mesh->{30},PlotPoints->30,MeshStyle->{Black}],ParametricPlot3D[{r Cos[t],r Sin[t]+2.75,-.48},{r,.1,.25},{t,0,2 π},PlotStyle->{Orange},MeshFunctions->{#5&},Mesh->{30},PlotPoints->30,MeshStyle->{Black}],ParametricPlot3D[{.1 Cos[t],.1 Sin[t]+2.75,z},{z,-.48,-.43},{t,0,2 π},PlotStyle->{Orange},MeshFunctions->{#5&},Mesh->{30},PlotPoints->30,MeshStyle->{Black}],ParametricPlot3D[{.25 Cos[t],.25 Sin[t]+2.75,z},{z,-.48,-.43},{t,0,2 π},PlotStyle->{Orange},MeshFunctions->{#5&},Mesh->{30},PlotPoints->30,MeshStyle->{Black}]];

Now, we construct the model using the fins, mouth, polyEllipsoid, Sphere and Cylinder primitives, lighting, and viewpoint settings.  The oscillation effect is obtained by transforming the vertices using sinusoids.

Here's one frame.

With[{t=0},Show[{Graphics3D[{EdgeForm[],Orange,Specularity[White,5],First@mouth,First@Normal[ParametricPlot3D[polyEllipsoid[.45,.85,.45,{0,2.65,0}],{θ,0,2Pi},{ϕ,0,Pi},Mesh->None,PlotStyle->{Orange}]],Table[Cylinder[{{0,y-.125,0},{0,y+.125,0}},.5 Cos[y/1.75-π/7]],{y,-2,2,.25}],Cylinder[{{0,2.75,0},{.7,3.25,.2}},.15],Cylinder[{{0,2.75,0},{-.7,3.25,.2}},.15],RGBColor[.3,.3,.3],Specularity[White,50],Sphere[{-.8,3.3,.2},.25],Sphere[{.8,3.3,.2},.25],Orange,Specularity[White,5],Table[Cylinder[{{.75 Cos[π/3] Sin[phi]+.2,3.05+.75Sin[π/3] Sin[phi],.75 Cos[phi]-1},{.75 Cos[π/3] Sin[phi+.37]+.2,3.05+.75Sin[π/3] Sin[phi+.37],.75 Cos[phi+.37]-1}},.2-phi/24],{phi,.1,7π/8,.3}],Table[Cylinder[{{.75 Cos[2 π/3] Sin[phi]-.2,3.05+.75Sin[2 π/3] Sin[phi],.75 Cos[phi]-1},{.75 Cos[2 π/3] Sin[phi+.37]-.2,3.05+.75Sin[2 π/3] Sin[phi+.37],.75 Cos[phi+.37]-1}},.2-phi/24],{phi,.1,7π/8,.3}]}],Table[fin[0,i,0],{i,-1.5,1,.4}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{(2 Cos[y/1.1]) x,y+1,z},Table[fin[0,i,0],{i,-2,-1,.5}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{.5 x,y,.5z+x},Table[fin[0,i,0],{i,-2,-1,.5}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{-.5 x,y,.5 z+x},Table[fin[0,i,0],{i,-1.5,1,.4}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{-(2 Cos[y/1.1]) x,y+1, z}}/.{i_?NumberQ,j_?NumberQ,k_?NumberQ}->{i,j,k+(.1+.2i^2)Sin[j+t]},ViewPoint->{2,2,2},Lighting->{{"Ambient",RGBColor[.3,.3,.3]},{"Point",RGBColor[.6,.6,.6],{-3,8,4},1},{"Point",RGBColor[.6,.6,.6],{10,4,10},1}},SphericalRegion->True,Boxed->False,Axes->False,Background->Black,ImageSize->600,PlotRange->{{-2,2},{-3,5},{-2,2}}]]

The following code animates the above image to show the fins flapping while keeping the ViewPoint constant.

flapping=Table[Show[{Graphics3D[{EdgeForm[],Orange,Specularity[White,5],First@mouth,First@Normal[ParametricPlot3D[polyEllipsoid[.45,.85,.45,{0,2.65,0}],{θ,0,2Pi},{ϕ,0,Pi},Mesh->None,PlotStyle->{Orange}]],Table[Cylinder[{{0,y-.125,0},{0,y+.125,0}},.5 Cos[y/1.75-π/7]],{y,-2,2,.25}],Cylinder[{{0,2.75,0},{.7,3.25,.2}},.15],Cylinder[{{0,2.75,0},{-.7,3.25,.2}},.15],RGBColor[.3,.3,.3],Specularity[White,50],Sphere[{-.8,3.3,.2},.25],Sphere[{.8,3.3,.2},.25],Orange,Specularity[White,5],Table[Cylinder[{{.75 Cos[π/3] Sin[phi]+.2,3.05+.75Sin[π/3] Sin[phi],.75 Cos[phi]-1},{.75 Cos[π/3] Sin[phi+.37]+.2,3.05+.75Sin[π/3] Sin[phi+.37],.75 Cos[phi+.37]-1}},.2-phi/24],{phi,.1,7π/8,.3}],Table[Cylinder[{{.75 Cos[2 π/3] Sin[phi]-.2,3.05+.75Sin[2 π/3] Sin[phi],.75 Cos[phi]-1},{.75 Cos[2 π/3] Sin[phi+.37]-.2,3.05+.75Sin[2 π/3] Sin[phi+.37],.75 Cos[phi+.37]-1}},.2-phi/24],{phi,.1,7π/8,.3}]}],Table[fin[0,i,0],{i,-1.5,1,.4}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{(2 Cos[y/1.1]) x,y+1,z},Table[fin[0,i,0],{i,-2,-1,.5}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{.5 x,y,.5z+x},Table[fin[0,i,0],{i,-2,-1,.5}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{-.5 x,y,.5 z+x},Table[fin[0,i,0],{i,-1.5,1,.4}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{-(2 Cos[y/1.1]) x,y+1, z}}/.{i_?NumberQ,j_?NumberQ,k_?NumberQ}->{i,j,k+(.1+.2i^2)Sin[j+t]},ViewPoint->{2,2,2},Lighting->{{"Ambient",RGBColor[.3,.3,.3]},{"Point",RGBColor[.6,.6,.6],{-3,8,4},1},{"Point",RGBColor[.6,.6,.6],{10,4,10},1}},SphericalRegion->True,Boxed->False,Axes->False,Background->Black,ImageSize->300,PlotRange->{{-2,2},{-3,5},{-2,2}}],{t,0,2 π,.1}];

flapping[[5]]

The following animation shows the fins flapping while allowing the ViewPoint to simulate a circular path making the creature appear to swim in a circle.

swimming=Table[Show[(({Graphics3D[{EdgeForm[],Orange,Specularity[White,5],First@mouth,First@Normal[ParametricPlot3D[polyEllipsoid[.45,.85,.45,{0,2.65,0}],{θ,0,2Pi},{ϕ,0,Pi},Mesh->None,PlotStyle->{Orange}]],Table[Cylinder[{{0,y-.125,0},{0,y+.125,0}},.5 Cos[y/1.75-π/7]],{y,-2,2,.25}],Cylinder[{{0,2.75,0},{.7,3.25,.2}},.15],Cylinder[{{0,2.75,0},{-.7,3.25,.2}},.15],RGBColor[.3,.3,.3],Specularity[White,50],Sphere[{-.8,3.3,.2},.25],Sphere[{.8,3.3,.2},.25],Orange,Specularity[White,5],Table[Cylinder[{{.75 Cos[π/3] Sin[phi]+.2,3.05+.75Sin[π/3] Sin[phi],.75 Cos[phi]-1},{.75 Cos[π/3] Sin[phi+.37]+.2,3.05+.75Sin[π/3] Sin[phi+.37],.75 Cos[phi+.37]-1}},.2-phi/24],{phi,.1,7π/8,.3}],Table[Cylinder[{{.75 Cos[2 π/3] Sin[phi]-.2,3.05+.75Sin[2 π/3] Sin[phi],.75 Cos[phi]-1},{.75 Cos[2 π/3] Sin[phi+.37]-.2,3.05+.75Sin[2 π/3] Sin[phi+.37],.75 Cos[phi+.37]-1}},.2-phi/24],{phi,.1,7π/8,.3}]}],Table[fin[0,i,0],{i,-1.5,1,.4}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{(2 Cos[y/1.1]) x,y+1,z},Table[fin[0,i,0],{i,-2,-1,.5}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{.5 x,y,.5z+x},Table[fin[0,i,0],{i,-2,-1,.5}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{-.5 x,y,.5 z+x},Table[fin[0,i,0],{i,-1.5,1,.4}]/.{x_?NumberQ,y_?NumberQ,z_?NumberQ}->{-(2 Cos[y/1.1]) x,y+1, z}}/.{i_?NumberQ,j_?NumberQ,k_?NumberQ}->{i,j,k+(.1+.2i^2)Sin[j+t]})/.{i_?NumberQ,j_?NumberQ,k_?NumberQ}->{i,j,k}.{{Cos[-t/4],Sin[-t/4],0},{-Sin[-t/4],Cos[-t/4],0},{0,0,1}})/.{i_?NumberQ,j_?NumberQ,k_?NumberQ}->{i-10 Cos[-t/4],j -10 Sin[-t/4],k},ViewPoint->{.75,.75,.2},Lighting->{{"Ambient",RGBColor[.3,.3,.3]},{"Point",RGBColor[.6,.6,.6],{10,4,15},1}},SphericalRegion->True,Boxed->False,Axes->False,Background->Black,ImageSize->300,PlotRange->{{-12,12},{-12,12},{-2,2}},ViewAngle->3π/8],{t,0,8 π,.2}];

swimming[[8]]

Now, we export.

SetDirectory[NotebookDirectory[]];

Export["anomalocaris.jpg",gr]

Export["anomalocaris.mp4",flapping];

Export["anomalocaris-swim.mp4",swimming];

References

http://www.palaeos.com/Invertebrates/Arthropods/Anomalocarida/species3.html