Computer Graphics Forum (Proceedings of Eurographics 2008), 27(2):155163
L. Liu[1], C. Bajaj[2], J. O. Deasy[1], D. A. Low[1] and T. Ju[1]
[1]Washington University in St. Louis, USA
[2]University of Texas at Austin, USA
Abstract
Building surfaces from crosssection curves has wide applications including biomedical modeling.
Previous work in this area has mostly focused on connecting simple closed curves on parallel cross
sections. Here we consider the more general problem where input data may lie on nonparallel cross
sections and consist of curve networks that represent the segmentation of the underlying object by
different material or tissue types (e.g., skin, muscle, bone, etc.) on each crosssection. The desired
output is a surface network that models both the exterior surface and the internal partitioning of the
object. We introduce an algorithm that is capable of handling curve networks of arbitrary shape and
topology on crosssection planes with arbitrary orientations. Our algorithm is simple to implement and is
guaranteed to produce a closed surface network that interpolates the curve network on each crosssection.
Our method is demonstrated on both synthetic and biomedical examples.
A gallery of input curve networks and output surfaces reconstructed by our method.
Download

Environment: Run in Windows XP, I haven't tried in other environments.

Ctr2Suf Program & Manual: It includes debug and release versions of the executive program and manual book for how to run it.

Data: Some test examples and specification of the file formats.

Contour Generator: A tool to generate synthetic crosssectional curves from a 3D model.

Source Code: Source code is available udner request for research.

Poster: Second place in SIGGRAPH 2007 SRC(student research competition)
Input
.contour file format.
It starts with number of planes, followed by each plane.
For each plane, it has parameters for the plane, number of contour vertices, number
of contour edges, all the vertices represented as their locations and all the edges
represented as its composition and material configuration.
More specificially, a detailed description is as follows in line by line fashion:
File format  Format explanation 
#planes(t) 
first line, number of planes, it is t 
a[0] b[0] c[0] d[0] 
parameter for the first plane, the plane is a[0]x + b[0]y + c[0]z = d[0] 
#vers_1(m) #edges(n) 
number of contour vertices and number of edges on the plane, m and n respectively 
v[0]_x v[0]_y v[0]_z 
the first vertex's location 
v[1]_x v[1]_y v[1]_z 
the second vertex's location 
. . .

other vertices 
v[m1]_x v[m1]_y v[m1]_z 
last vertex's location 
e[0]_v_ind1 e[0]_v_ind2 e[0]_m_left e[0]_m_right 
the first and second edge's configuration, its two endpoints' index
in above vertex array, its material index on the left and right
side, they are explained more later. 
e[1]_v_ind1 e[1]_v_ind2 e[1]_m_left e[1]_m_right 
. . .

other edges 
e[n1]_v_ind1 e[n1]_v_ind2 e[n1]_m_left e[n1]_m_right 
last edge's configuration 
. . .

other planes in the same format 
a[t1] b[t1] c[t1] d[t1] 
last plane 
...... 
last plane's vertex and edge info in the same format 
Note:
 (1) No comments are allowed. Only 1 space is allowed between two numbers
 (2) All indicies start from 0.
 (3) Contours on one plane must be saved in one plane.
Saving them twice in two planes with the same plane parameters does not work.
 (4) When program takes in this format, it will do preprocessing of the data
to compute the intersection points between two contour planes, and check the consistency
of the data, such as valide material configuration.
To better illustrate the edge's materials, below shows one example of a slice in picture and its
representation in the file.
The illustrative picture:


Vertex with its index 2 

Edge with its index 4 

Material with index 2 

Material with index 1 

Material with index 0 
The corresponding plane in the file:
Vertex is represented as its location.
Edge is represented as: vertex_index1 vertex_index2 Material_left Material_right.
In file 
Explanation 
0 0 1 1 
z = 1 
7 7 
7 vertices, 7 edges 
0 1 1 
vertex 0 position 
0.5 0.75 1 
vertex 1 position 
1 1 1 
vertex 2 position 
1 0 1 
vertex 3 position 
0 0 1 
vertex 4 position 
0.25 0.25 1 
vertex 5 position 
0.75 0.25 1 
vertex 6 position 
0 2 2 1 
edge 0 composition, ver0 to ver2, left mat 2, right 1 
1 5 0 1 
other edges 
3 2 1 2 
1 6 1 0 
5 6 0 1 
0 4 1 2 
4 3 1 2 
Edge's left and right:

Left picture illustrates the edge's left and right.
Place down the plane with normal pointing upwards.
Based on the order of the two endpoints, the edge
has its direction(red arrow in the picture),
look along the direction, left side is the edge's left.
In the example above, normal of the slice points towards us.

.CtrGraph file format.
It starts with number of planes, followed by each plane.
For each plane, it has parameters for the plane, number of contour vertices, number
of contour edges, all the vertices represented as their locations and all the edges
represented as its composition and material configuration.
More specificially, a detailed description is as follows:
File format  Format explanation 
n #vertices(m) 
character 'n' and number of vertices: m 
v v[0]_x v[0]_y v[0]_z 
character 'v' and vertex 0 location 
v v[1]_x v[1]_y v[1]_z 
character 'v' and vertex 1 location 
v v[2]_x v[2]_y v[2]_z 
character 'v' and vertex 2 location 
. . . 

v v[m1]_x v[m1]_y v[m1]_z 
character 'v' and vertex m1 location 
n #planes(t) 
character 'n' and number of planes 
p p[0]_a p[0]_b p[0]_c p[0]_d #edges(n[0]) 
The first plane: character 'p' and plane parameters, a, b, c, d and
the number of contour edges on the plane. 
e e[0]_ind1 e[0]_ind1 e[0]_m_left e[0]_m_right 
each edge information:
character 'e' followed by two vertex indices refering
to the ones in the above vertex array, and two materials indices
on the left and right. Refer to the above input file format
for meaning of the left and right. 
e e[1]_ind1 e[1]_ind1 e[1]_m_left e[1]_m_right 
. . . 
e e[n[0]1]_ind1 e[n[0]1]_ind1 e[n[0]1]_m_left e[n[0]1]_m_right 
. . . 
other planes 
p p[t1]_a p[t1]_b p[t1]_c p[t1]_d #edges(n[t1]) 
last plane. 
e e[0]_ind1 e[0]_ind1 e[0]_m_left e[0]_m_right 
e e[1]_ind1 e[1]_ind1 e[1]_m_left e[1]_m_right 
. . . 
e e[n[t1]1]_ind1 e[n[t1]1]_ind1 e[n[t1]1]_m_left e[n[t1]1]_m_right 
Note:
 (1) Single lined comments are allowed!! With character #at the beginning.
 (2) All the beginning characters: n, a, p, e are necessary.
 (3) The contours must be well preprocessed, with all the intersection points among contours
precomputed and saved in the vertex list.
 Thanks to Daniel Einstein at Pacific Northwest National Laboratory who suggested this file format and came
up with the illustrative figure representation.
Output
.suf file format.
It starts with number of vertices and number of faces in the mesh,
followed by all the vertices represented as their locations and
triangular faces represented as three vertex indices and material indices on positive
and negative sides. Finally is the number of contour edges, followed by each contour edge
represented as two vertices indices.
More specificially, a detailed description is as follows:
File format  Format explanation 
#vers(m) #face(n) 
first line, number of vertices and faces, m and n respectively 
v[0]_x v[0]_y v[0]_z 
vertex 0 location: x y z 
v[1]_x v[1]_y v[1]_z 
vertex 1 location: x y z 
. . . 
other vertices locations 
v[m1]_x v[m1]_y v[m1]_z 
last vertex's location 
f[0]_v_ind1 f[0]_v_ind2 f[0]_v_ind3 f[0]_m_positive f[0]_m_negative 
face 0 configuration, vertices indices in the above array, materials on
the positive and negative sides of the face. See below for details. 
f[1]_v_ind1 f[1]_v_ind2 f[1]_v_ind3 f[1]_m_positive f[1]_m_negative 
face 1 
. . . 
other faces 
f[n1]_v_ind1 f[n1]_v_ind2 f[n1]_v_ind3 f[n1]_m_positive f[n1]_m_negative 
last face 
#Contour_Edges(t) 
contour edges number: t 
ctrE[0]_v_ind1 ctrE[0]_v_ind2 
contour edge 0 composition: vertices indices in the vertex array above 
ctrE[1]_v_ind1 ctrE[1]_v_ind2 
contour edge 1 
. . . 
other contour edges 
ctrE[t1]_v_ind1 ctrE[t1]_v_ind2 
last contour edge 
Note:
 (1) No comments are allowed. Only 1 space is allowed between two numbers
 (2) All indicies start from 0.
 (3) If the surface is manifold, it has two materials:
one for interior, the other for exterior; if there is no contour edges,
set the contour edges number as 0. Smoothing and refinement can be used if you turn your mesh into
the format as described above.
Positive and negative sides of a face:

The left picture shows the face in front and back view. According to the right hand rule, the order of the
vetex indices gives the normal direction of the face, which defines the positive side of the face.

Manual
Step 1: Read in a contour file.
Step 2: Surface Reconstruction.
Step 3: Surface Improvement
Optional: Drag mouse, with left button pressed to rotate, middle button pressed to
scale, and right button pressed to translate.