Your code is not complete.
To have solid cylinders and silhouette you have to mix the 3D OpenGL (unitcylinder, unitsphere, etc...) and the solids
package (to have silhouette of your cylinder).
For the construction I have created one function which draws a cylinder (solid and silhouette) and another function (a simple loop) to avoid a very long list of triple
and axis.
The code is not perfect, there is one warning because I use the silhouette function.
import three;
import solids;
size3(10cm);
currentprojection=orthographic(600,450,200);
triple v=O;
real cyl_r=.4;
real cyl_h=.7;
triple axis=Z;
void cyl_oriented_shifted(triple pO=v, real r=cyl_r, real h=cyl_h, triple maxis=Z)
{
// v should be the center
// if maxis=O there is no cylinder, not very elegant
if (maxis!=O)
{
surface cylinder=shift(pO)*align(unit(maxis))*shift((0,0,-cyl_h/2))*scale(cyl_r,cyl_r,cyl_h)*unitcylinder;
surface disq_cyl=shift(pO)*align(unit(maxis))*shift((0,0,-cyl_h/2))*scale(cyl_r,cyl_r,cyl_h)*unitdisk;
surface disq_cyl1=shift(pO)*align(unit(maxis))*shift((0,0,cyl_h/2))*scale(cyl_r,cyl_r,0)*unitdisk;
revolution rcyl = cylinder(pO-h/2*unit(maxis), r, h, maxis);
material whitem = material(diffusepen=white,emissivepen=white);
draw(cylinder,whitem,render(merge=true));
draw(disq_cyl,whitem);
draw(disq_cyl1,whitem);
draw(rcyl,black+1bp);
}
}
void sequence_of_node_and_segment (triple [] T, triple [] AT, pen p1=currentpen)
{
// T is the array of node
// AT the array of associated axis for the cylinders or not if AT[i]==O
for (int i=0;i<T.length;++i)
{
cyl_oriented_shifted(T[i],cyl_r,cyl_h,AT[i]);
if (i<T.length-1)
{ // the segment
draw(T[i]--T[i+1],p1);
}
}
}
pen pentige=black+2bp;
// lower part
triple[] RL={(0,0,0),(0,0,1), (2,0,4),(0,0,8),(0,3,8),(2,3,4),(0,3,1),(0,3,0)};
triple[] ARL={O,Y,Y,Y,Y,Y,Y,O};
sequence_of_node_and_segment(RL,ARL,pentige);
// arms
triple[] HRL={(0,-1.5,11), (0,-1.5,13.3),(0,-1.5,14),(0,0,14),(0,3,14),(0,4.5,14),(0,4.5,13.3),(0,4.5,11)};
triple[] AHRL={Y,X,O,Y,Y,O,X,Y};
sequence_of_node_and_segment(HRL,AHRL,pentige);
// to the upper part
triple[] HC={(0,1.5,8), (0,1.5,10),(0,1.5,14),(0,1.5,15.6)};//,(0,0,13),(0,3,13),(0,4.5,13),(0,4.5,12),(0,4.5,10)};
triple[] AHC={O,Z,Z,Y};
sequence_of_node_and_segment(HC,AHC,pentige);
draw(shift((0,1.5,8))*scale3(.2)*unitsphere,material(diffusepen=white,emissivepen=white));
revolution sph=sphere((0,1.5,8),.2);
draw(sph.silhouette(),black+1bp);
and the result. Please notice that the picture is not vectorized since the true 3D OpenGL renderer is used.
