Download presentation
Presentation is loading. Please wait.
1
Large Mesh Simplification using Processing Sequences Martin Isenburg UNC Chapel Hill Peter Lindstrom LLNL Livermore Stefan Gumhold GRIS Tubingen Jack Snoeyink UNC Chapel Hill
2
Overview Motivation Background Processing Sequences Adapted Simplification Schemes – OOCS – Wu & Kobbelt Conclusion
3
Motivation
4
Large Meshes 3D scansisosurfaces
5
Large Meshes 3D scansisosurfaces
6
PPM isosurface 235 million vertices 469 million triangles 235 million rtices million triangles over 8 Gigabyte ! hampers: distributing / loading rendering processing
7
in-core algorithms of choice: – Qslim – Rsimp Mesh Simplification alternative: processing sequence [ Garland & Heckbert ’97 ] [ Brodsky & Watson ’00 ] require ~ 200 bytes per vertex current out-of-core approaches: 1. piece by piece 2. external memory 3. polygon soup [ Lindstrom ’00 ] [ Hoppe ’98 ] [ Cignoni et al. ’03 ]
8
Background
9
Related Work Large Mesh Processing – Simplification – Compression – Visualization Systems Main Techniques 1. Mesh Cutting 2. Online Processing 3. Batch Processing
10
cut mesh into small pieces process each separately special treatment for cuts stitch result back together 1. Mesh Cutting figure courtesy of Hugues Hoppe
11
2. Online Processing external memory data structures “random” mesh access figure courtesy of Paolo Cignoni
12
3. Batch Processing ( 1 ) polygon soup single scan over stream of de-referenced triangles no explicit connectivity [ Lindstrom ’00 ]
13
3. Batch Processing ( 2 ) polygon soup single scan over stream of de-referenced triangles no explicit connectivity ( coherent ) reconstruct figure courtesy of Jianhua Wu and Leif Kobbelt [ Wu & Kobbelt ’03 ]
14
Sequenced Processing coherent triangle ordering interleaved with vertices small footprint streaming finalization of vertices [ Isenburg & Gumhold ’03 ]
15
Quadric Error Matrices accumulate error vertex placement sum of squared distances of point to set of planes quadric error: figure courtesy of Michael Garland [ Garland & Heckbert ’97 ] Q = q 00 q 01 q 02 q 03 q 10 q 11 q 12 q 13 q 20 q 21 q 22 q 23 q 30 q 31 q 32 q 33 v T Qv
16
Processing Sequences
17
A little history … Compressor – region growing
18
A little history … Compressor – region growing Out - of - Core Mesh – transparent – caching clusters
19
A little history … Compressor – region growing Out - of - Core Mesh – transparent – caching clusters Compact Format – small footprint – streaming
20
A little history … Compressor – region growing Out - of - Core Mesh – transparent – caching clusters Compact Format – small footprint – streaming
21
A little history … Compressor – region growing Out - of - Core Mesh – transparent – caching clusters Compact Format – small footprint – streaming
22
interleaved ordering of triangles and vertices that “grows regions” processing boundary Processing Sequences border edges Q7Q7 Q1Q1 Q4Q4 available information: – first & last use of edges & vertices – surface border maintain data along boundary
23
unprocessed region Abstractions boundary-based – one boundary – process immediately processed region waiting area processing boundary
24
processed region unprocessed region Abstractions boundary-based – one boundary – process immediately buffer-based – two boundaries – process in buffer – read to fill – write to empty in-core buffer output boundary input boundary processed region unprocessed region processing boundary waiting area
25
OOCS
26
stream in polygon soup – triangle after triangle vertex clustering – one quadric per grid cell output sensitive – store all quadrics no border info – tangential term added
27
OOCS Q Q input output
28
OOCS Q Q Q Q input output
29
OOCS Q Q Q Q input output
30
OOCS Q Q QQ Q Q Q input output
31
OOCS QQ Q Q Q Q QQ Q Q Q Q QQ Q input output Q
32
OOCS QQ Q Q Q Q QQ QQ Q Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q input output
33
OOCS QQ Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q input output
34
OOCS QQ Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q input output
35
OOCS QQ Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q input output
36
OOCS using PS
37
fewer artifacts – do not collapse multiple layers into single vertex – improved surface boundaries streaming output OOCS using PS memory insensitive – maintain much fewer quadrics
38
processed region unprocessed region Q7 7 Q5 5 5 5 OOCS using PS ( detail ) Q3 3 Q4 4 4
39
processed region unprocessed region Q5 5 Q4 Q7 7 4 4 Q3 5 3 OOCS using PS ( detail )
40
processed region unprocessed region Q5 5 Q4 Q7 7 4 4 5 Q3 turns into vertex quadric OOCS using PS ( detail )
41
processed region unprocessed region Q5 5 Q4 Q7 7 4 4 5 Q8 8 OOCS using PS ( detail )
42
processed region unprocessed region Q5 5 Q4 Q7 7 4 5 Q8 8 OOCS using PS ( detail )
43
processed region unprocessed region Q5 5 Q4 Q7 7 5 Q8 8 quadric turns into vertex 8 OOCS using PS ( detail )
44
processed region unprocessed region Q5 5 Q7 7 5 Q8 8 8 Q9 9 OOCS using PS ( detail )
45
processed region unprocessed region Q5 5 Q7 7 Q8 8 8 Q9 9 quadric merge OOCS using PS ( detail )
46
OOCS using PS input output Q Q
47
OOCS using PS Q Q Q Q output input
48
OOCS using PS Q Q Q Q Q Q output input Q Q
49
OOCS using PS Q Q Q Q Q Q Q Q Q Q Q Q Q output input Q Q Q Q
50
OOCS using PS Q Q Q Q Q Q Q Q Q Q Q output input Q Q Q Q Q Q Q Q Q Q Q Q Q Q
51
OOCS using PS Q Q Q Q Q Q output input Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
52
OOCS using PS Q QQ Q Q output input Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
53
OOCS using PS Q QQ Q Q Q output input Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
54
OOCS using PS Q Q Q Q Q output input Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
55
OOCS using PS output input Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
56
Improved Mesh Quality OOCS-PS OOCS vertices: 33,053 non-manifold vertices:3,366 vertices: 35,134 non-manifold vertices:897
57
Lower Memory Requirements 373 million vertices OOCS memory: 3,282 MB time: 67 min OOCS-PS memory: 121 MB time: 83 min 23 million vertices
58
Wu & Kobbelt
59
stream coherent soup into buffer reconstruct connectivity – hash on vertex data – finalize complete stars input boundary aa a a a a a a a accumulating cc collapsible randomized edge collapse – one quadric per vertex – accumulating collapsible randomized streaming output
60
Wu & Kobbelt c a a a a a a a input output
61
Wu & Kobbelt c c c c c c c c c a a a a a a a a a a a a a a a a a a a a a a a a a a a input output
62
Wu & Kobbelt c c c c c a a a a c a a a a a a c c c a a a a a a a a a a a a c c c a a a a a a a a a a a a a a a a a c c c output input
63
Wu & Kobbelt c c c c c a a a a a a a a a a c c c a a a a a a a a a a a a c c c a a a a a a a a a a a a a a a a a c c a a a a a c c c c c c c c c a a a a c c c c a a output input
64
Wu & Kobbelt c c c c c a a a a a a a a a a c c a a a a a a a a a a a a c c a a a a a a a a a a a a a a c c a a a a a c c c c c a a a a c c c c a a a a a a a a c c c c c c c c c c c c c c c c c c c output input
65
Wu & Kobbelt c a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a c a a a a a c a a a a a a a a a a c c c c c c c c a a a a a a a a a a a a a a a a a a a a a a c c c c c c c c c c c c c output input
66
Wu & Kobbelt a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a c c a a a a a a a a a a a a a a a a a aa a a a c c c a a a a a a a a a a a a a a a c c cc c c c c c c c output input
67
Wu & Kobbelt a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a c aa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a c c a a a a c c c c c c c c c a c a output input
68
Wu & Kobbelt a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a c c c c c a a a a c output input
69
border Wu & Kobbelt a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a c c c c c output input
70
Wu & Kobbelt c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c output input
71
Wu & Kobbelt c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c output input
72
Wu & Kobbelt c c c c c c c c c c c c c c c c c c c c c c c c output input
73
Wu & Kobbelt output input
74
Wu & Kobbelt using PS
75
less fragmentation of buffer – processing sequence input / output – more collapsible edges immediate boundary simplification – mesh borders known early – truly “streaming” output faster connectivity reconstruction – indexed input / API support
76
Wu & Kobbelt using PS ( detail ) unprocessed region processed region input boundary output boundary in-core triangle buffer a a a a a a a accumulating c c c c c c c collapsible
77
Wu & Kobbelt using PS ( detail ) unprocessed region processed region input boundary output boundary in-core triangle buffer c c c c c c c collapsible a a a a a a a accumulating c
78
Wu & Kobbelt using PS ( detail ) unprocessed region processed region input boundary output boundary in-core triangle buffer c c c c c c c collapsible a a a a a a a a accumulating c c
79
Wu & Kobbelt using PS ( detail ) unprocessed region processed region input boundary output boundary in-core triangle buffer c c c c c collapsible a a a a a a a a accumulating c c c
80
Wu & Kobbelt using PS ( detail ) unprocessed region processed region input boundary output boundary in-core triangle buffer c c c c c collapsible a a a a a a a a accumulating c c c
81
Wu & Kobbelt using PS ( detail ) unprocessed region processed region input boundary output boundary in-core triangle buffer c c c c c collapsible a a a a a a a a accumulating c c
82
Wu & Kobbelt using PS input output
83
Wu & Kobbelt using PS a c a a a a a a a a a a c c c output input
84
Wu & Kobbelt using PS a a aa a a a a a a a a a a a a a a c c c c c c c c c c c c c output input
85
Wu & Kobbelt using PS a a a a a a a a a a a a a a a aa a a a a a a a a a a c cc c c c c c c c c c c c c c c c c c c c c c c c output input
86
Wu & Kobbelt using PS a a a a a a a a a a aa a a a a a a a a a a a a c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c output input
87
Wu & Kobbelt using PS a a a a a a a a a a a a a a c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c input output
88
Wu & Kobbelt using PS a a a a a a a a a a a a c c c c c c c c c c c c c c c c c c c c c c c c c c c c c input output
89
Wu & Kobbelt using PS a a a a a a a a a a a a c c c c c c c c c c c a c c c c c c c c c c c c c c c c input output
90
Wu & Kobbelt using PS a a a a a a a a a c a c c c c c c c c c c c c c a c c c c c c c c c c c c c c c c c input output
91
Wu & Kobbelt using PS c c c c c c c c c c c c c c c c c input output
92
Wu & Kobbelt using PS input output
93
Conclusion & Current Work
94
Summary processing sequences – efficient large mesh access – streaming input and output – abstractions: boundary-based buffer-based adapted simplification algorithms: – OOCS – Wu & Kobbelt
95
length of processing boundary – possible – traversal is optimized for lowest bit-rate change heuristic Issues O( n )O( n ) [ Bar-Yehuda & Gotsman ‘96 ] external memory mesh to create processing sequences …? – expensive to build & use – defeats purpose …
96
Generating PS on-the-fly input: “streaming mesh” v 1.32 0.12 0.23 v 1.43 0.23 0.92 v 0.91 0.15 0.62 f 1 2 3 done 2 v 0.72 0.34 0.35 f 4 1 3 done 1 ⋮ ⋮ ⋮ ⋮ vertices finalized ( not used by subsequent triangles )
97
extend to volume meshes promote – provide API create / improve – lower processing boundary length Current Work compress – encode on-the-fly
98
Thank You.
101
v0v0 v1v1 v2v2 fill Growing Operations v0v0 v1v1 v2v2 end v0v0 v1v1 v2v2 start v0v0 v1v1 v2v2 joinadd v0v0 v1v1 v2v2 processing boundary
102
read next triangle info about current triangle optional maintaining of user data Prototype of PS API intopen(const char* file_name); intread_triangle(); voidclose(); intt_idx[3]; float* t_pos_f[3]; intt_vflag[3]; intt_eflag[3]; voidset_edata( void* data, int i ); voidset_vdata( void* data, int i ); void*get_edata( int i ); void*get_vdata( int i );
103
Example ( 1 ) v0v0 v1v1 v2v2 eflag[0] = PS_FIRST eflag[1] = PS_FIRST eflag[2] = PS_FIRST vflag[0] = PS_FIRST vflag[1] = PS_FIRST vflag[2] = PS_FIRST v0v0 v1v1 v2v2 eflag[0] = PS_FIRST eflag[1] = PS_FIRST | PS_LAST eflag[2] = PS_FIRST | PS_LAST vflag[0] = PS_FIRST vflag[1] = PS_FIRST | PS_LAST vflag[2] = PS_FIRST border edge entering edge border edge e0e0 e1e1 e2e2 start
104
entering edge leaving edges border edge entering edge leaving edge v0v0 v1v1 v2v2 add Example ( 2 ) eflag[0] = PS_LAST eflag[1] = PS_FIRST | PS_LAST eflag[2] = PS_FIRST vflag[0] = 0 vflag[1] = 0 vflag[2] = PS_FIRST eflag[0] = PS_LAST eflag[1] = PS_FIRST eflag[2] = PS_LAST vflag[0] = PS_LAST vflag[1] = 0 vflag[2] = 0 fill v0v0 v1v1 v2v2
105
Example ( 3 ) eflag[0] = PS_LAST eflag[1] = PS_LAST eflag[2] = PS_LAST vflag[0] = PS_LAST vflag[1] = PS_LAST vflag[2] = PS_LAST eflag[0] = PS_LAST eflag[1] = PS_LAST eflag[2] = PS_LAST vflag[0] = PS_LAST vflag[1] = 0 vflag[2] = PS_LAST leaving edges v0v0 v1v1 v2v2 v0v0 v1v1 v2v2 end
106
Computing Smooth Normals ps.open ( “bunny.sma” ) ; while ( ps.read_triangle() ) tmp = compute ( ps.t_pos[ 0 ], ps.t_pos[ 1 ], ps.t_pos[ 2 ] ); for ( i = 0; i < 3; i++ ) if ( ps.vflag[i] & PS_FIRST ) n = new Normal (); ps.set_vdata ( n, i ); else n = ps.get_vdata ( i ); add ( n, tmp ); if ( ps.vflag[i] & PS_LAST ) normalize ( n ); do something delete n; ps.close ();
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.