module _rod(a, b, r) { translate(a) sphere(r=r); translate(b) sphere(r=r); dir = b-a; h = norm(dir); if(dir[0] == 0 && dir[1] == 0) { // no transformation necessary cylinder(r=r, h=h); } else { w = dir / h; u0 = cross(w, [0,0,1]); u = u0 / norm(u0); v0 = cross(w, u); v = v0 / norm(v0); multmatrix(m=[[u[0], v[0], w[0], a[0]], [u[1], v[1], w[1], a[1]], [u[2], v[2], w[2], a[2]], [0, 0, 0, 1]]) cylinder(r=r, h=h); } } module outline(points3,r=0.5) { p=len(points3); for(start = [0:1:p-1]) { stop=(start+1)%p; a = points3[start]; b = points3[stop]; // FIXME: Do not repeat points echo(a,b); _rod(a,b,r); } } module wireframe(points3,polygons,r=0.5) { for(p=polygons) { for(set = [0:1:len(p)-1]) { a = points3[p[set]]; b = points3[p[(set+1)%len(p)]]; // FIXME: Do not repeat points echo(p[set],p[(set+1)%len(p)],a,b); _rod(a,b,r); } } }