Virtual Seashells
by Alain Goriely, goriely@math.arizona.edu, ( http://www.math.arizona.edu/~goriely)
Abstract: This worksheet show how to represent seashells. Application Areas/Subjects: Education, Biology, 3D graphics Keywords: Seashells, 3D plots Prerequisites: plots
Note: Send me an e-mail (comments-criticisms) if you use this worksheet.
> restart:with(plots):
Warning, the name changecoords has been redefined
Introduction
Seashells can be represented by surfaces in 3D. Their self similar shape can be generated by a simple formula with a certain number of free parameters. Let ( ) be a point on the shell. Then, this point can be written in the following form:
=
This formula was obtained by A. Cortie and follows a series of basic rotations around the different axes (helical axis, body axis, etc..). In this formula the parameters are:
The following worksheet is a straightforward application of this formula for different typical shapes of seashells. It is not a profound exercice (it is actually straightforwad).
Just try to have fun with virtual seashells! I
f anybody has the courage to do it, it would be nice to transform these plots in vrml (easy) and apply realistic textures files (harder). It would be nice to have a real 3D virtual seashells museum in vrml (let me know!).
The model
> rad:=proc(aa) aa/360*2*Pi end:
> x:=D*(A*sin(beta)*cos(Theta)+R*cos(s+phi)*cos(Theta+Omega)-R*sin(mu)*sin(s+phi)*sin(Theta+Omega))*exp(Theta*cot(alpha)): y:=(-A*sin(beta)*sin(Theta)-R*cos(s+phi)*sin(Theta+Omega)-R*sin(mu)*sin(s+phi)*cos(Theta+Omega))*exp(Theta*cot(alpha)): z:=(-A*cos(beta)+R*sin(s+phi)*cos(mu))*exp(Theta*cot(alpha)):
> SR:=R=RE+k; SRE:=RE=1/sqrt(cos(s)^2/a^2+sin(s)^2/b^2); Sk:=k=L*exp(-(2*(s-P)/W[1])^2)*exp(-(2*g/W[2])^2); Sg:=g=2*Pi/N*(Theta*N/2/Pi-round(Theta*N/2/Pi));
Natalina
> S:={D=1,alpha=rad(80),beta=rad(40),phi=rad(55),mu=rad(10), Omega=rad(30),smM=rad(-270)..rad(80),A=25,a=12,b=16,P=0,L=0}; R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):
> plot3d(R1,s=subs(S,smM),Theta=-2*Pi..4*Pi,grid=[100,100],style=patchnogrid,scaling=constrained,orientation=[-68,80],lightmodel=light2,shading=xy);
> #plot3d(R1,s=subs(S,smM),Theta=-2*Pi..4*Pi,grid=[40,60],scaling=constrained,orientation=[-68,67],color=(sin(5*s))^2,style=patchnogrid,orientation=[-68,80],lightmodel=light2,shading=xy);
Lyria
> S:={D=1,alpha=rad(83.9),beta=rad(-19),phi=rad(45),mu=rad(1), Omega=rad(-2),smM=rad(-51)..rad(9),A=50,a=40,b=14,P=0,L=8,W[1]=rad(6),W[2]=rad(27),N=8}; R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):
> plot3d(R1,s=subs(S,smM),Theta=-4*Pi..4*Pi,grid=[80,150],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xyz,orientation=[-48,75]);
Turritella
> S:={D=1,alpha=rad(88.9),beta=rad(4),phi=rad(55),mu=rad(1), Omega=rad(-2),smM=rad(-267)..rad(39),A=22.2,a=1.3,b=1.5,P=0,L=0}; R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):
> plot3d(R1,s=subs(S,smM),Theta=-30*Pi..4*Pi,grid=[30,250],orientation=[-83,89],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy);
Oxystele
> S:={D=1,alpha=rad(84.9),beta=rad(7),phi=rad(-36),mu=rad(1), Omega=rad(-2),smM=rad(-70)..rad(70),A=47,a=40,b=19,P=0,L=0,W[1]=6,W[2]=27,N=8}; R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):
> plot3d(R1,s=subs(S,smM),Theta=-20*Pi..4*Pi,grid=[40,150],style=patchnogrid,lightmodel=light2,shading=xy,scaling=constrained,orientation=[-68,94]);
Nautilus
> S:={D=1,alpha=rad(80),beta=rad(90),phi=rad(0),mu=rad(0), Omega=rad(0),smM=rad(-163)..rad(163),A=2,a=2,b=1.5,P=0,L=0}; R:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])));
> plot3d(R,s=subs(S,smM),Theta=Pi..4*Pi,grid=[30,60],scaling=constrained,orientation=[-79,54],style=patchnogrid,lightmodel=light2,shading=xy);
Planorbis
> S:={D=1,alpha=rad(84),beta=rad(85),phi=rad(10),mu=rad(45), Omega=rad(5),smM=rad(-150)..rad(130),A=45,a=20,b=30,P=0,L=0,W[1]=6,W[2]=27,N=8}; R:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z]))):
> plot3d(R,s=subs(S,smM),Theta=-1*Pi..4*Pi,grid=[40,60],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-94,65]);
Ammonite
> S:={D=1,alpha=rad(83),beta=rad(90),phi=rad(1),mu=rad(1), Omega=rad(1),smM=rad(-170)..rad(170),A=2.5,a=1,b=0.9,P=10,W[1]=100,W[2]=20,N=15,L=1/2}; R1:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z]))):
> plot3d(R1,s=subs(S,smM),Theta=-1*Pi..4*Pi,grid=[40,60],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-90,62]);
Conus
> S:={D=1,alpha=rad(87),beta=rad(7),phi=rad(78),mu=rad(0), Omega=rad(0),smM=rad(-180)..rad(2),A=7,a=4.3,b=1,P=0,L=0,W[1]=6,W[2]=27,N=8}; R:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):
> plot3d([R[3],R[1],R[2]],s=subs(S,smM),Theta=-12*Pi..4*Pi,grid=[60,80],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-76,137]);
Helcion
> S:={D=1,alpha=rad(18),beta=rad(90),phi=rad(0),mu=rad(0), Omega=rad(-40),smM=rad(-180)..rad(180),A=450,a=400,b=310,P=0,L=0,W[1]=6,W[2]=27,N=8}; R:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])));
> plot3d(R,s=subs(S,smM),Theta=-0*Pi..4*Pi,grid=[40,60],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-94,65]);
Codakia
> S:={D=1,alpha=rad(37),beta=rad(90),phi=rad(0),mu=rad(1), Omega=rad(1),smM=rad(-180)..rad(180),A=10500,a=10000,b=10500,P=0,L=0,W[1]=6,W[2]=27,N=8}; R2:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z]))):
> plot3d(R2,s=subs(S,smM),Theta=-1*Pi..4*Pi,grid=[40,100],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-79,-3]);
Adding bumps
> S1:={D=1,alpha=rad(83),beta=rad(90),phi=rad(1),mu=rad(1), Omega=rad(1),smM=rad(-170)..rad(170),A=2.5,a=1,b=0.9};
> S2:={W[1]=rad(100),W[2]=rad(20),N=15,L=1/2,P=rad(10)};
> R1:=simplify(subs(S1,S2,subs(SR,SRE,Sk,Sg,[x,y,z]))):
> plot3d(R1,s=subs(S1,S2,smM),Theta=-Pi..3*Pi,grid=[150,150],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-90,15]);
Struthiolaria
> S:={D=1,alpha=rad(86.9),beta=rad(13),phi=rad(40),mu=rad(10), Omega=rad(30),smM=rad(-168)..rad(24),A=5,a=1.8,b=1.6,P=rad(-15),L=1/2,W[1]=rad(5),W[2]=rad(5),N=16}; R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):
> plot3d(R1,s=subs(S,smM),Theta=-8*Pi..4*Pi,grid=[150,150],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-58,82]);
References
A. Cortie : Digital Seashells Comput & Graphics Vol 17 , pp. 79-84 (1993)
Disclaimer: While every effort has been made to validate the solutions in this worksheet, Waterloo Maple Inc. and the contributors are not responsible for any errors contained and are not liable for any damages resulting from the use of this material.