<- previous index next ->
It may take a sequence of files to get the final 3D printer object you want. This page shows what I used to get a pipe curved into a toroid. In addition to getting the correct shape of an object, covered in triangles, the normal vector from every triangle must point into the object. The normal vector for the top of the object must point down. The normal vector for the bottom of the object must point up. The normal vector for the outside of the object must point in. The normal vector to a triangle with points P1, P2, P3 each with x,y,z is: ax = P3 x - P2 x length from P3 to P2 ay = P3 y - P2 y P1 az = P3 z - P2 z / \ Taking points clockwise bx = P2 x - P1 x length from P2 to P1 / \ reverses the direction of by = P2 y - P1 y P3____P2 the normal from counter bz = P2 z - P1 z clockwise. The code shown nx = ay*bz-az*by direction of normal is for counter clockwise ny = az*bx-ax*bz normal. nz = ax*by-ay*bx s = sqrt(nx*nx+ny*ny+nz*nz) standard to make the length of normal vector 1.0 nx = nx / s final vector normal to triangle ny = ny / s nz = nz / s # see code for tri4 and tri4r to make .dat file The code in java, given P1 x in v[0][0], P1 y in v[0][1], P1 z in v[0][2] P2 in v[1], P3 in v[2] computes the normal vector nx, ny, nz. ax = v[2][0] - v[1][0]; ay = v[2][1] - v[1][1]; az = v[2][2] - v[1][2]; bx = v[1][0] - v[0][0]; by = v[1][1] - v[0][1]; bz = v[1][2] - v[0][2]; nx = ay*bz-az*by; ny = az*bx-ax*bz; nz = ax*by-ay*bx; s = Math.sqrt(nx*nx+ny*ny+nz*nz); nx = nx / s; ny = ny / s; nz = nz / s; The code sequence and output is: Base just inside, outside, top and bottom to get normal in correct direction cyl1_base.java cyl1_base.dat cyl1_base.stl The code sequence and output to get a short pipe is: cyl1_pipe.java cyl1_pipe.dat cyl1_pipe.stl The code sequence and output to slope the pipe is: cyl1_slop.java cyl1_slop.dat cyl1_slop.stl The code sequence and output to curve the pipe 360 degrees, first try to get inside, outside and just bottom, 8 bends, and thus just the upper half, make two and glue together, is: hcyl1_curv8.java hcyl1_curv8.dat hcyl1_curv8.stl rotated 90 degrees to see direction of normal vectors The code sequence and output for 16 bends, smoother, is: hcyl1_curv16.java hcyl1_curv16.dat hcyl1_curv16.stl The code sequence and output for 32 bends, smoother is: hcyl1_curv.java hcyl1_curv.dat hcyl1_curv.stl Having a .stl file, you can compute area and volume of the object: read_stl.java volume_stl.java volume_stl_java.out bound1a.stl volume_stl_cube1.out cube1.stl Make a sphere for 3D printer sphere_dat.py3 sphere_dat_py3.out sphere16p.dat light_dat sphere16p.dat use dat_to_stl sphere16p.dat sphere16p.stl and make 3D object, or sphere_stl.py3 sphere_stl_py3.out sphere16p.stl files: light_dat.java source code light_stl.java source code light_normal.java source code dat_to_stl.java source code datread.java source code datwrite.java source code It is better to make two half spheres and glue them together. Utility programs to modify .dat files include: zero_z_dat.py3 keep only z=0 and z positive invert_z_dat.py3 negate all z values x_to_z_dat.py3 swap x and z values y_to_z_dat.py3 swap y and z values Example of object made with my 3D printer One of many "shape" files shape11.py3 source code shape11_py3.dat .dat output shape11_py3.stl .stl output outline of 3D object printed by light_dat coloring enclosing surfaces light_normal of shape11.dat all of surface is triangles with normal vector pointing inside my Dremmel software to make gcode file did not need bottom or top Z surface make file for creating the .stl make_shape11 my makefile
<- previous index next ->
Many web sites on Java GUI, AWT, Swing, etc. Many web sites on Python wx, tk, qt, etc.