z 1 x 1 y 1 V 0 V 1 x 02 y 01 x 01 x 0 y 0 z 0 y 02 z 01 v 10 v 20 v 02 v 22 v 12 v 11 v 00 v 21 v 01



Similar documents
Efficient Storage, Compression and Transmission

A Short Introduction to Computer Graphics

Introduction to Computer Graphics

1. Relational database accesses data in a sequential form. (Figures 7.1, 7.2)

Multiresolution 3D Rendering on Mobile Devices

COMP175: Computer Graphics. Lecture 1 Introduction and Display Technologies

The Essentials of CAGD

Visualizing and Animating the Winged-Edge Data Structure

Model Repair. Leif Kobbelt RWTH Aachen University )NPUT $ATA 2EMOVAL OF TOPOLOGICAL AND GEOMETRICAL ERRORS !NALYSIS OF SURFACE QUALITY

Computer Graphics Hardware An Overview

Dual Marching Cubes: Primal Contouring of Dual Grids

New Hash Function Construction for Textual and Geometric Data Retrieval

DUAL HALF EDGE DATA STRUCTURE IN DATABASE FOR BIG DATA IN GIS

Parallel Simplification of Large Meshes on PC Clusters

Faculty of Computer Science Computer Graphics Group. Final Diploma Examination

Character Animation from 2D Pictures and 3D Motion Data ALEXANDER HORNUNG, ELLEN DEKKERS, and LEIF KOBBELT RWTH-Aachen University

Overview Motivation and applications Challenges. Dynamic Volume Computation and Visualization on the GPU. GPU feature requests Conclusions

SECONDARY STORAGE TERRAIN VISUALIZATION IN A CLIENT-SERVER ENVIRONMENT: A SURVEY

CUBE-MAP DATA STRUCTURE FOR INTERACTIVE GLOBAL ILLUMINATION COMPUTATION IN DYNAMIC DIFFUSE ENVIRONMENTS

Computer Applications in Textile Engineering. Computer Applications in Textile Engineering

How To Create A Surface From Points On A Computer With A Marching Cube

Lecture Notes, CEng 477

3 Data Representations

Course Overview. CSCI 480 Computer Graphics Lecture 1. Administrative Issues Modeling Animation Rendering OpenGL Programming [Angel Ch.

SCALABILITY OF CONTEXTUAL GENERALIZATION PROCESSING USING PARTITIONING AND PARALLELIZATION. Marc-Olivier Briat, Jean-Luc Monnot, Edith M.

Distributed Memory Machines. Sanjay Goil and Sanjay Ranka. School of CIS ond NPAC.

Recent Advances and Future Trends in Graphics Hardware. Michael Doggett Architect November 23, 2005

Parallel Ray Tracing using MPI: A Dynamic Load-balancing Approach

Computer Graphics CS 543 Lecture 12 (Part 1) Curves. Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

Lecture 4. Parallel Programming II. Homework & Reading. Page 1. Projects handout On Friday Form teams, groups of two

Dual Contouring of Hermite Data

Grow & fold: compressing the connectivity of tetrahedral meshes

Feature Sensitive Surface Extraction from Volume Data

Line-Art Rendering of 3D-Models


Bernice E. Rogowitz and Holly E. Rushmeier IBM TJ Watson Research Center, P.O. Box 704, Yorktown Heights, NY USA

Off-line Model Simplification for Interactive Rigid Body Dynamics Simulations Satyandra K. Gupta University of Maryland, College Park

Rendering Microgeometry with Volumetric Precomputed Radiance Transfer

Max-Min Representation of Piecewise Linear Functions

HIGH AND LOW RESOLUTION TEXTURED MODELS OF COMPLEX ARCHITECTURAL SURFACES

Using Photorealistic RenderMan for High-Quality Direct Volume Rendering

Face Locating and Tracking for Human{Computer Interaction. Carnegie Mellon University. Pittsburgh, PA 15213

NVIDIA IndeX Enabling Interactive and Scalable Visualization for Large Data Marc Nienhaus, NVIDIA IndeX Engineering Manager and Chief Architect

FRIEDRICH-ALEXANDER-UNIVERSITÄT ERLANGEN-NÜRNBERG

A FRAMEWORK FOR REAL-TIME TERRAIN VISUALIZATION WITH ADAPTIVE SEMI- REGULAR MESHES

TOWARDS AN AUTOMATED HEALING OF 3D URBAN MODELS

Visibility Map for Global Illumination in Point Clouds

Lecture 7 - Meshing. Applied Computational Fluid Dynamics

Customer Training Material. Lecture 4. Meshing in Mechanical. Mechanical. ANSYS, Inc. Proprietary 2010 ANSYS, Inc. All rights reserved.

Consolidated Visualization of Enormous 3D Scan Point Clouds with Scanopy

DATA ANALYSIS II. Matrix Algorithms

IMPROVING PERFORMANCE OF RANDOMIZED SIGNATURE SORT USING HASHING AND BITWISE OPERATORS

visualization. Data Generation Application

Two hours UNIVERSITY OF MANCHESTER SCHOOL OF COMPUTER SCIENCE. M.Sc. in Advanced Computer Science. Friday 18 th January 2008.

A Generalized Marching Cubes Algorithm Based On Non-Binary Classifications

A fast and robust algorithm to count topologically persistent holes in noisy clouds

Wavelet Representation of functions defined on Tetrahedrical Grids

Volumetric Meshes for Real Time Medical Simulations

Advanced Rendering for Engineering & Styling

Editing Common Polygon Boundary in ArcGIS Desktop 9.x

Solution of Linear Systems

Delaunay Based Shape Reconstruction from Large Data

Introduction to Computer Graphics. Jürgen P. Schulze, Ph.D. University of California, San Diego Fall Quarter 2012

Surface bundles over S 1, the Thurston norm, and the Whitehead link

A Multiresolution Approach to Large Data Visualization

Self-Positioning Handheld 3D Scanner

Segmentation of building models from dense 3D point-clouds

How To Draw In Autocad

William Paterson University of New Jersey Department of Computer Science College of Science and Health Course Outline

MODERN VOXEL BASED DATA AND GEOMETRY ANALYSIS SOFTWARE TOOLS FOR INDUSTRIAL CT

A 3d particle visualization system for temperature management

L20: GPU Architecture and Models

AnatomyBrowser: A Framework for Integration of Medical Information


Clipping Plane. Overview Posterior

c 2002 I.P. Ivrissimtzis, M.A. Sabin, N.A. Dodgson

Intersection of a Line and a Convex. Hull of Points Cloud

ProTrack: A Simple Provenance-tracking Filesystem

An Eective Load Balancing Policy for

3. Interpolation. Closing the Gaps of Discretization... Beyond Polynomials

Arrangements And Duality

From Scattered Samples to Smooth Surfaces

Load Balancing for a Parallel Radiosity Algorithm

Choosing a Computer for Running SLX, P3D, and P5

Mean Value Coordinates

Modelling, Extraction and Description of Intrinsic Cues of High Resolution Satellite Images: Independent Component Analysis based approaches

Distributed Area of Interest Management for Large-Scale Immersive Video Conferencing

Proposal for a Virtual 3D World Map

Distributed Computing over Communication Networks: Maximal Independent Set

Voronoi Treemaps in D3

GPU Architecture. Michael Doggett ATI

2: Introducing image synthesis. Some orientation how did we get here? Graphics system architecture Overview of OpenGL / GLU / GLUT

Radeon HD 2900 and Geometry Generation. Michael Doggett

Subdivision for Modeling and Animation

Topology-based network security

Neural Gas for Surface Reconstruction

FCE: A Fast Content Expression for Server-based Computing

Solving Geometric Problems with the Rotating Calipers *

USING TRIANGULATIONS IN COMPUTER SIMULATIONS OF GRANULAR MEDIA

Multiresolution Terrain Database Visualization

Transcription:

Directed Edges A Scalable Representation for Triangle Meshes Swen Campagna, Leif Kobbelt, and Hans-Peter Seidel University of Erlangen, Computer Graphics Group Am Weichselgarten 9, D-91058 Erlangen, Germany Email: fcampagna,kobbelt,seidelg@informatik.uni-erlangen.de Abstract In a broad range of computer graphics applications the representation of geometric shape is based on triangle meshes. General purpose data structures for polygonal meshes typically provide fast access to geometric objects (e.g. points) and topologic entities (e.g. neighborhood relation) but the memory requirements are rather high due to the many special congurations. In this paper we present a new data structure which is specically designed for triangle meshes. The data structure enables to trade memory for access time by either storing internal references explicitly or by locally reconstructing them on demand. The trade-o can be hidden from the programmer by an object-oriented API and automatically adapts to the available hardware resources or the complexity of the mesh (scalability). 1 Introduction Many algorithms use triangle meshes for representing geometric surfaces. The simple triangle can serve as a basic surface primitive to adaptively approximate smooth freeform geometry. A triangle mesh naturally allows to adapt the required number of primitives to the geometric shape instead of the basic topology of an arbitrary object. Triangle meshes are ecient, since the triangle is currently the only surface patch that is directly supported by computer graphics hardware and even software rendering methods like ray tracing or radiosity prefer to use piecewise linear primitives to represent geometric objects due to gains in performance [KS97, SP94]. A triangle is uniquely dened by the geometric position of its three vertices. Thus, assuming 4 bytes oat values, each 3d-triangle requires 3 3 4 = 36 bytes. This way of storing individual triangles (cf. Fig. 1) is sucient for several applications, e.g., when each triangle is processed separately.

0 1 x 00 x 01 x 02 y 00 z 00 y 01 y 02 z 01 z 02 x 0 y 0 z 0 x 1 y 1 z 1 V 0 V 1 v 00 v 01 v 02 v 10 v 11 v 12 v 20 v 21 v 22 0 1 2 Figure 1: Storing individual triangles. Figure 2: Shared vertex data structure. Algorithms that perform operations on a triangle mesh, e.g., mesh editing systems [KCVS98, ZSS97] or mesh decimation algorithms [Ros97, PS97], need more information beyond the mere shape of each separate triangle. If the geometric position of one vertex is modied, this operation aects not only the shape of a single triangle that contains this vertex. Instead, all triangles containing a vertex at the same geometric position should be modied. This can be achieved by the concept of shared vertices: all triangles sharing a common vertex store (integer) pointers to the same physical instance. Thus, a vertex at a certain geometric position needs to be specied only once and it may be shared by an arbitrary number of triangles. Euler's formula V E + F = 2 [FvDFJ92] tells us that a manifold triangle mesh (3F 2E) with n vertices contains m 2n triangles. Therefore, the shared vertex representation of a triangle mesh requires 3 4 n = 12n bytes for the geometry (the geometric position of the vertices) and 3 4 m = 12m bytes for the topology (the triangles referencing three vertices each), assuming 4 bytes for each reference (cf. Fig. 2). This results in 12n + 12m 18m bytes for a triangle mesh consisting of m triangles and saves about 50 percent compared to individual triangles. This amount of memory can be considered as a lower limit for storing triangle meshes with immediate and random access to each triangle. In principle, every information required by an algorithm may be determined from the shared vertex representation. Neighboring triangles sharing a common edge reference two identical vertices that span this edge. Explicitly storing this neighborhood relation requires additional 3 4 m = 12m bytes and further 4 n 2m bytes for referencing one triangle attached to each vertex. The set of triangles t i = (v i0; v i1; v i2) referencing a certain vertex v describe the topological neighborhood of v: neighboring vertices v j, adjacent edges v v j, triangles t i, orbit-edges v a v b ft i g with v a ; v b 6= v, and so on. Unfortunately, access to such and similar information requires a global search on the standard shared vertex data structure, if the neighborhood information is not stored explicitly. Several data structures have been developed to provide fast access (ideally O(1)) to the information that is required by dierent algorithms. The most popular ones are the wingededge [Bau72], quad-edge [GS85], and half-edge [Mae88] data structures. Fig. 3 shows the winged-edges according to O'Rourke [O'R95]. Each vertex stores its geometric position and 2

e b v b Vertices v i e d x 0 y 0 z 0 x 1 y 1 z 1 e 1 f a f b Faces f j e 1 e 2 e 3 e 4 e a v a e c Winged edges e k a b v 0 v fa 0 fb 0 ea 0 eb 0 ec 0 ed 0 0 Figure 3: Winged-edge data structure. a reference to one of its edges, while each polygonal face only points to one of its enclosing edges. An edge stores references to the two vertices v a and v b spanning that edge, to the two neighboring faces f a and f b, and to the four \wings" e a ; : : : ; e d. This data structure requires 4 4 n + 4 m + 8 4 3 m 8m + 4m + 48m = 60m bytes for a triangle mesh 2 with m triangles. This is about three times the memory compared to the shared vertex representation, but therefore the neighborhood and adjacency can be looked up directly. For algorithms processing on a mesh data structure this means that we trade memory for performance (even compared to the shared vertex representation with neighborhood information that still requires some search operations). We are not going to discuss the huge variety of mesh data structures in detail, nor will we examine theoretical aspects like duality, completeness, and so on. Instead, we focus on practical requirements and present a new scalable data structure for triangle meshes. 2 Practical Requirements In practice, many objects represented by triangle meshes contain isolated vertices or edges that are locally non-manifold for several reasons [CKS98]. On the other hand, many data structures are restricted to orientable 2-manifold triangle meshes. Even if there are only some few artifacts that are locally non-manifold within a large data set, these data structures are not able to represent such an object. Other data structures which are capable of storing non-manifold meshes typically require more memory due to the fact that they have to handle non-manifolds all over the whole object by using extra memory, even if most entities are in fact 2-manifold. A compromise between the two approaches can be found by using the data structure that we discuss in the next section. As previously mentioned, several sophisticated data structures have been developed, most of them capable to represent general polygonal meshes instead of just the special instance of a triangle mesh. Specializing to triangles obviously allows to design more ecient data structures. Of course, the more explicit information is stored, the more memory is required, but 3

v b next neigh prev v a Figure 4: The data structure records two vertices v a, v b, the neighboring edge e ng and the previous and next edges e pv and e nx for each directed edge. The memory for some values (gray) can be exchanged by a constant amount of additional calculations. the faster is the access to the required data. Unfortunately, memory is a hard limit in computer systems. Even virtual memory does not help in most cases, since the mapping of a complex triangle mesh to the linear structure of the memory usually opposes the need for local coherence access to memory. Drastic slowdown of the performance due to extensive swapping is the result. Performance is a very important aspect, but time is in general a soft limit. When doubling the amount of input data to be processed, it is acceptable to wait even more than twice the time to get a result, if this is necessary. But if doubling the amount of data implies that the data structure does not t into the memory of a computer, this makes it impossible to work on a data set. As a result, the implementation of a data structure can be considered as a compromise between memory requirements and performance gains. We propose a scalable data structure, where additional memory can be utilized to speed up the access and hence the performance as long as enough resources are available. Once the hard memory limit is reached, performance can be traded for memory in order to maximize the complexity of meshes which can be processed on a given system. We will present a new data structure for triangle meshes that has been motivated by this idea in the following section. 3 Directed-Edge Data Structure We are rst going to describe the directed-edge data structure for the case of oriented 2-manifolds. Afterwards we will present our extension to handle non-manifold triangle meshes. 4

Vertices v i x 0 y 0 z 0 x 1 y 1 z 1 e 1 Directed edges e j (full sized) v 0 a v 0 b ng nx pv or (medium sized) v 0 b ng pv or (small sized) v 0 b ng 0 Figure 5: Three variants with dierent memory requirements of the directed-edge data structure for a triangle mesh. A single triangle is represented by three directed edges (cf. Fig. 4). Thus, the common edge v a v b of two neighboring triangles corresponds to two directed edges v a! v b and v b! v a. This is very similar to the concept of half-edges [Mae88]. For each directed edge the following information is stored: a starting vertex v a, a target vertex v b, the previous, next, and neighboring edges e pv, e nx, and e ng. We store all directed edge data structures in an array, such that the i'th triangle is represented by the directed edges at the entries 3i, 3i + 1, and 3i + 2. Thus, we do not have to store explicit references from each triangle to an edge and vice versa. Instead, we derive these references from the given algorithmic context. Storing a reference to a single directed-edge for each vertex provides fast access to the local neighborhood of such an entity. As described so far, a total amount of 4 4 n + 5 4 3 m 8m + 60m = 68m bytes is required for a triangle mesh with n vertices and m 2n triangles (cf. Fig. 5). Not explicitly storing the references between triangles and edges saves 4 m + 4 3 m = 16m bytes. Since we restricted to triangle meshes, we can further substitute memory by computation time. Access to v a of an edge e can be replaced by v b of the previous edge of e. The inquiry to the next edge of e can be answered with the previous edge of the previous edge of e (cf. Fig. 4). Thus, we can substitute the memory for the entries v a and e nx by some few additional computations. Please note that these additional calculations are of constant time and do not require a search (as would be necessary for general polygons). Of course, we could replace v b and e pv by a similar strategy instead. But these entries are required more frequently and thus should be available directly. The simplied structure requires 4 4 n + 3 4 3 m 8m + 36m = 44m bytes of memory. So far, we considered the entries v a, v b, e pv, e nx, and e ng as general references that could be implemented either as pointers or as array-indices. If we decide to use only array-indices 5

as references we can save further memory and shift some load to the CPU instead. Given an edge e, where e is an array-index, then the previous and next edge can be determined by the following expressions (in C-style pseudocode): prev( e ) = (e%3 == 0)? e+2 : e-1; next( e ) = (e%3 == 2)? e-2 : e+1; Thus, the data structure for a directed edge needs to explicitly store values only for v b and e ng. This results in a total memory requirement of 4 4 n + 2 4 3 m 8m + 24m = 32m bytes. This is optimal compared to the shared vertex representation with additional neighborhood information, but the new data structure is more convenient to access the required information from an algorithmic point of view. As an example, the following pseudo-code returns the indices idx[0], : : :, idx[n-1] of the n neighboring vertices for the v'th vertex: int get_neighbors( int v, int idx[] ) { int ee = vertex[v].e(); // each vertex points to one emanating edge idx[0] = edge[ee].v1(); // store the first vertex-index int n = 1; // one index in the array int e = edge[ee].prev(); // the previous edge of ee... int e = edge[e].neigh(); //... and the respective neighbor while( e!= ee ) { // until all emanating edges visited idx[n] = edge[e].v1(); // store the current target vertex... n++; //... and update the count e = edge[e].prev(); // update the previous edge... e = edge[e].neigh(); //... and the respective neighbor } } return n; // n indices have been found So far, we considered only orientable 2-manifold triangle meshes. As discussed in the previous section, non-manifold vertices or edges should also be tolerated by a data structure when used in practical applications. Since we do not want to spend any (or only few) additional memory for this purpose and we assume that the number of non-manifold entities is typically neglectable compared to the complexity of the whole mesh, we use the following simple but eective strategy. Using integer values as array-indices for the references to neighboring edges allows us to use the sign-bit without any additional implementation-eort. The value for the neighboring edge e ng is zero or positive for every pair of directed edge mates that represent a 2-manifold interior edge. A directed edge on a topological boundary is marked by a certain 6

Vertices x i y i z i 4 Array for non e c0 e c1 2 3 ( 4) 1 = 3 (array index) manifold regions e c2 e c3 e c4 Figure 6: The entry 4 is used to determine the array-index ( 4) 1 = 3 of a separate array that lists the connected components attached to non-manifold vertices by referencing one edge of each component. negative entry for e ng, e.g. 1. A non-manifold edge or an edge whose two triangles are of opposite orientation may be marked by 2. A 2-manifold vertex references one of its emanating edges. For non-manifold vertices the same strategy can be used as for edges. A negative array-index indicates such a node. Removing the negative sign provides a positive value that points to a separate array which lists either all edges emanating from that vertex or the connected components attached to that vertex. Fig. 6 shows an example for the second strategy. This simple trick saves memory (compared to linked lists for each vertex where only one list-entry is used for most entities) and is easy to implement. 4 Results We used the presented data structure for our mesh decimation algorithm [KCS98]. Using object-oriented techniques allowed us to simply switch between the described strategies: a full, medium, and a small sized data structure. Currently, we may use only one of these three implementations at the same time within a single executable. By using further object-oriented techniques it is possible to provide all data structures at the same time and to decide at runtime, which one should be used, e.g., considering the memory requirements of a certain model. Figure 7 shows the results when using the three dierent strategies for decimating different meshes (measured on a MIPS R10000 CPU at 250 MHz) when using our highly optimized mesh decimation algorithm (implementation optimizations are described in [CKS98]). The dashed line shows the results for the mesh with additional color attributes that is shown in Figure 8. The other two lines show the results for decimating a mesh without attributes at two dierent target resolutions (it is a property of the mesh decimation algorithm that the average performance decreases with the total number of removed triangles). As expected, the smallest data structure provides the slowest performance since we exchanged speed for memory. Spending additional memory enhances the performance of the algorithm in this case. The performance-results do not dier in a broad range, since we exploit 7

3800 removed /sec. 3700 3600 32 small 44 medium sized data structure 68 full bytes/ Figure 7: Using three dierent instances of the scalable data structure within a highly optimized mesh decimation algorithm. The dashed line shows the result for the mesh shown in Figure 8, while the solid lines show the results for another mesh. local caching of intermediate calculations within the mesh decimation algorithm and thus reduce access requests to the underlying mesh data structure to a minimum. There may be circumstances, where the above behavior need not be true, since lower memory may sometimes result in higher CPU-performance due to the architecture of modern computer systems (rst and second level caches, main memory, swap memory). The number of additional calculations can be less than the time required for waiting for data that has to be passed through the memory hierarchy. This behavior depends on the specic application and the used computer architecture. As mentioned before and as shown in Figure 8, a mesh may also contain additional attributes, e.g. colors, surface normals, or texture coordinates [CB97]. Of course, such attributes may also be added to the directed-edge data structure at the cost of additional memory. Finally, Table 1 shows a comparison of the mesh data structures considered in this article. Please note that the individual triangles and shared vertex representation do not provide any immediate neighborhood information which is crucial for many applications. 5 Conclusion We presented a new scalable data structure for triangle meshes that allows to trade performance for memory, depending on the specic application or the size of the data that has to be processed. Implementation details can be hidden from the programmer by an object-oriented API. Nonetheless, implementation and use of this scalable data structure is very simple. We have veried our design goals by using this new data structure as a core component of our mesh decimation algorithm. Especially memory ecient handling of meshes with 8

Figure 8: The upper row shows the original mesh consisting of 770,436 triangles (topological boundaries in blue). The mesh in the lower row has been reduced to 286,103 triangles. only few local non-manifold entities has proven to be very important when using such a data structure in practice. References [Bau72] B.G. Baumgart. Winged-edge polyhedron representation. Technical report, STAN-CS-320, Stanford University, 1972. [CB97] Rikk Carey and Gavin Bell. The Annotated VRML 2.0 Reference Manual. Addison-Wesley, Reading, Massachusetts, 1997. [CKS98] Swen Campagna, Leif Kobbelt, and Hans-Peter Seidel. Enhancing Digital Documents by Including 3D-Models, 1998. To appear in Computers & Graphics. [FvDFJ92] James D. Foley, Andries van Dam, Steven K. Feiner, and John F. Jughes. Computer Graphics - Principles and Practice. Addison-Wesley, Reading, Massachusetts, 2nd edition, 1992. 9

supports neighdata structure bytes/4 non- bor- point prev. next manifold hood reference edge edge individual triangles 36 yes - - (M) (M) shared vertex 18 yes - M (M) (M) shared vertex with neig. 32 no M M (M) (M) winged-edge 60 no M M M M full directed-edge 68 yes M M M M medium directed-edge 44 yes M M,C M C small directed-edge 32 yes M M,C C C Table 1: Comparison of several data structures. \M" indicates entities that are explicitly stored, \C" means that the information may be calculated in O(1), and \-" marks entities that require computations of complexity O(1). [GS85] [KCS98] [KCVS98] [KS97] [Mae88] [O'R95] [PS97] [Ros97] [SP94] Leonidas Guibas and Jorge Stol. Primitives for the Manipulation of General Subdivisions and the Computation of Voronoi Diagrams. ACM Transactions on Graphics, 4(2):74{123, April 1985. Leif Kobbelt, Swen Campagna, and Hans-Peter Seidel. A General Framework for Mesh Decimation. In Proceedings of Graphics Interface '98, pages 43{50, 1998. Leif Kobbelt, Swen Campagna, Jens Vorsatz, and Hans-Peter Seidel. Interactive Multi-Resolution Modeling on Arbitrary Meshes. In Proceedings of SIGGRAPH '98 (Orlando, Florida, July 19{24, 1998), Computer Graphics Proceedings, Annual Conference Series, pages 105{114, July 1998. Krzysztof S. Klimaszewski and Thomas W. Sederberg. Faster Ray Tracing Using Adaptive Grids. IEEE Computer Graphics and Applications, pages 42{ 51, January-February 1997. Martti Maentylae. An Introduction to Solid Modeling. Computer Science Press, 1988. Joseph O'Rourke. Computational Geometry in C. Cambridge University Press, Cambridge, 1995. Enrico Puppo and Roberto Scopigno. Simplication, LOD and Multiresolution Principles and Applications, 1997. Tutorial Eurographics '97. Jarek Rossignac. Simplication and Compression of 3D Scenes, 1997. Tutorial Eurographics '97. Francois Sillion and Claude Puech. Radiosity & Global Illumination. Morgan Kaufmann, 1994. 10

[ZSS97] Denis Zorin, Peter Schroder, and Wim Sweldens. Interactive Multiresolution Mesh Editing. In Proceedings of SIGGRAPH '97 (Los Angeles, California, August 3{8, 1997), Computer Graphics Proceedings, Annual Conference Series, pages 259{268, August 1997. 11