Presentation is loading. Please wait.

Presentation is loading. Please wait.

Large Mesh Simplification using Processing Sequences Martin Isenburg UNC Chapel Hill Peter Lindstrom LLNL Livermore Stefan Gumhold GRIS Tubingen Jack Snoeyink.

Similar presentations


Presentation on theme: "Large Mesh Simplification using Processing Sequences Martin Isenburg UNC Chapel Hill Peter Lindstrom LLNL Livermore Stefan Gumhold GRIS Tubingen Jack Snoeyink."— Presentation transcript:

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.

99

100

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 ();


Download ppt "Large Mesh Simplification using Processing Sequences Martin Isenburg UNC Chapel Hill Peter Lindstrom LLNL Livermore Stefan Gumhold GRIS Tubingen Jack Snoeyink."

Similar presentations


Ads by Google