Due date: Friday, May 30th, 11:59pm
In this homework you will build a volume representation of your object
and run a marching cubes algorithm on it to get your final watertight model.
We decided to spare you the programming effort, given the fact that acquiring,
processing and aligning enough views to get a good coverage of the object
is enough work.
First, you need to apply a transformation to the aligned views, so that
all the points fall inside the carving volume (the cube (x=0..1, y=0..1,
z=0..1) ). In order to do this, run the program
~emilp/volcarve/fit2vol (on ugcs).
It takes a single argument, the name of the file that lists all your aligned
views. This program will save your .params files under .params.old and
will create new .params files. The only parameter that is modified is malign,
which is composed with a uniform scale and a translation. Fit2vol will
also check for consistency between the .params and .range files. It will
complain if they do not match. They match if all the points in the .range
file are along the "funny ray" generated by the grid structure
that was described in class (the ray given by the intersection of the horizontal
plane given by the camera row and the vertical plane given by the projector
column). In other words, if the grid cell (i,j) contains coordinates (x,y,z),
then the y coordinate in pixels of (x,y,z) projected onto the camera plane
should be i+rngx0, and the x coordinate in pixels of (x,y,z) projected
on the projector plane should be j+rngy0. You will get warning messages
for all the points that do not comply. The program will go on, however.
The next step is to obtain the volume. Run ~emilp/volcarve/volcarve
giving it as argument the same file that lists all your views. Press R
(refine) a couple of times - until you get to the resolution of 128^3.
(you need to be inside the Inventor window when you press keys, and the
cursor must be the little arrow, not the hand -> to switch between them,
press ESC). If there are pieces of uncarved volume floating around your
object, you may edit them out, either by selected connected components,
or with the cutting tool (best way!).
To get the cutting tool, press C (in the Edit mode: arrow cursor). You
can rotate the plane around by clicking on a point inside the 3 circles
and dragging it. (the circles will turn yellow while you rotate)
You can move the plane along its normal by clicking and dragging a point
of the plane that is not inside the sphere generated by the 3 circles.
To move the whole scene (object+plane), use the hand cursor (ESC to switch).
When you are done, press D (in the arrow cursor). All the voxels that are
on the red side of the plane will be deleted. To get rid of the cutting
tool, press C again. Refining will also remove the tool.
To delete stuff by connected components, click on the piece you want to
delete (the cursor must be the little arrow and the cutting plane should
not be visible). The text window from which you started volcarve should
say 'Finding connected component. Starting from ...' (if it doesn't, you
didn't click on the right thing). Wait until you get the message 'Press
F to revert to full volume. Press D to delete the piece'. You should see
in the Inventor window just the piece of unwanted volume. If you can still
see your object, bad luck ... the piece of garbage was connected to your
object and you cannot delete it. You need more views to separate them (or
you need to use a plane behind the object).
You can edit stuff out at any resolution. If you edit something out by
connected component and then refine the volume you might see small pieces
floating at the borders of the big chunk you just deleted. This happens
because what you see on the screen are the voxels marked as FULL, and the
ones you don't see might be either EMPTY or BOUNDARY. When you refine,
the BOUNDARY voxels might split up into FULL smaller voxels. Deleting a
piece gets rid of all the FULL voxels in the piece and of <one
layer> of boundary. If your boundary is thicker, you get full voxels
again at the next finer resolution.
Pressing V will save out your volume in the format needed for marching
cubes: a bunch of slice.xx files will appear in the current directory.
For 128 resolution, they take up 4 Megs. For 256, 32 Megs. The size gets
multiplied by 8 for each refinement step. Since you cannot do much with
these slice files, except build the final mesh, it's a good ideea to delete
them after you run VTK. If you want to save your editing work, press S
to save the run-length encoded volume (much smaller), which you can load
later with volcarve (to do additional editing or to use additional views).
The third step is to get a surface from your volume. Run ~emilp/volcarve/marchCubes
giving it as a parameter the resolution of your volume. After VTK is finished
running, you should find a volume.iv in the current directory.
marchCubes is just a small shell script that sets a couple of variables
and then runs the VTK Tcl script that does all the data processing. The
Tcl script itself has a lot more more functionality and is very well explained
at http://www.crd.ge.com/~lorensen/seg12/segemented16.html. I encourage
you to take a look at it (you don't need to know Tcl)
You may want to play a bit with the parameters of the script, particularly
with the standard deviation of the Gaussian filter, the value for the isosurface
and the smoothing factor. If you raise the standard deviation or the isosurface
value, you might be able to get rid of small islands of unwanted volume,
without editing it out in volcarve, but you might also generate holes in
the thin parts of your object (you object will shrink a bit, too). A higher
smoothing factor might kill the high-frequency details in your object,
a lower smoothing factor might produce a rugged appearance.
The sources for VTK are in /ug/space/ee148/vtk. Here
is the VTK homepage.
The sources for fit2vol & volcarve are in ~emilp/volcarve/src. Please
email me any bug reports.
On your web page, put a link to the best complete model of your object that you can get. You will have to do an in-class presentation, too.