Computer Graphics Forum (Proceedings of Eurographics 2008), 27(2):155-163
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 cross-section curves has wide applications including bio-medical 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 non-parallel 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 cross-section. 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 cross-section 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 cross-section.
Our method is demonstrated on both synthetic and bio-medical 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 cross-sectional 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[m-1]_x v[m-1]_y v[m-1]_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[n-1]_v_ind1 e[n-1]_v_ind2 e[n-1]_m_left e[n-1]_m_right |
last edge's configuration |
. . .
|
other planes in the same format |
a[t-1] b[t-1] c[t-1] d[t-1] |
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[m-1]_x v[m-1]_y v[m-1]_z |
character 'v' and vertex m-1 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[t-1]_a p[t-1]_b p[t-1]_c p[t-1]_d #edges(n[t-1]) |
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[t-1]-1]_ind1 e[n[t-1]-1]_ind1 e[n[t-1]-1]_m_left e[n[t-1]-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[m-1]_x v[m-1]_y v[m-1]_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[n-1]_v_ind1 f[n-1]_v_ind2 f[n-1]_v_ind3 f[n-1]_m_positive f[n-1]_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[t-1]_v_ind1 ctrE[t-1]_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.