550 likes | 661 Views
Geometric Compression Through Topological Surgery. Gabriel Taubin (IBM) Jarek Rossignac (Georgia Tech). Problem Statement. Want to send mesh across network Compress Losslessly Want to save CPU time Decompress on load Want to get triangle strips Save on vertex reads + transforms.
E N D
Geometric Compression Through Topological Surgery Gabriel Taubin (IBM) Jarek Rossignac (Georgia Tech)
Problem Statement • Want to send mesh across network • Compress Losslessly • Want to save CPU time • Decompress on load • Want to get triangle strips • Save on vertex reads + transforms
Basic Idea • Use properties of planar graphs to compress • Extend to graphs 3d meshes using hacks • Lossily drop bits left & right out of vertex position since vertex pos dominates size • Use reasonably good predictor to “guess” location
Compressing Topology • Start with meshes having Euler Characteristic 2 (Deformable to sphere)
Compressing Topology • Want to cut it into a planar mesh with lots of long triangle strips
Compressing Topology • A MST on vertices indicates some interesting cut lines
Compressing Topology • Notice how the edge boundary graph has 2 edges for each MST cut line
Compressing Topology • Splaying our faithful Euler-2 characteristic mesh looks as follows
Marching edge Compressing Topology • Note that in the flattened shape a binary graph can represent edges
Compressing Topology • If we save these two graphs & 1 bit per marching edge graph as to how it fits to MST, we’ve got topology of Euler-2 meshes
Not all cuts are equal • But some will earn you a prize from l’Institut Paul Bocuse in Lyons • Others…
Why cuts are not equal • Vertex edge graph stored as: • Integer: runlength • Bit: leaf? • Bit: more runs starting from here? • Longer triangle strips • Amortize-out 2 starting vertices • Faster rendering
1st cut: spanning tree construction • Use edge length and run MST algorithm • Disaster with a capital D
Actual attempt to make MST • Distance from edge midpoint to tree root
Modification to improve result • 2 pass algorithm where only non-branching edges are allowed on 1st pass
Concentric Rings Method • Choose a root, order by concentric rings
Connect concentric layers • with triangle that minimize branches
Concentric Rings applied to bone • Generating concentric rings makes for much longer triangle runs
B=f(A)+B G=f(A,B,C,D)+G C=f(A,B)+c H=f(A,B,C,D,G)+H B D=f(A,B,C)+D E=f(A,B,C,D)+E C F=f(A,B,C,D,E)+F D F E G H Encoding Vertex Position • Vertex Spanning Tree offers mechanism for vertex position prediction • Build a prediction function based on samples from parents in run A • Store per-vertex fixed-point delta from given predictor
Vertex Position Predictor • Assume a linear predictor f(v0…vK)=b0v0+…+bkvk • Thus estimate b0…bk by minimizing the least square error over all vertices of depth n>k for given model
Dealing with real meshes • Jump Edges • Ugly hack to deal with non-spheres • Read paper for “juicy” details • Making sure that edges line up after quantization + prediction
Results • They don’t all add up • Feels like they use the red herring called • ASCII VRML • To boost their results (sometimes literally)
Results: (what a) Crock • About as lossless as a spam stock investment 12 bits per coord 10 bits per coord 8 bits per coord original
17332 vertices x 12+34404 triangles x 12 = 248,832 80,056 x 19.63 = 1,571,499 80,056 /0.1658 = 482,864 Results:Architecture
Their stated results • Parsing a file in compressed binary is 20x faster than in ascii • So is transcribing it from stone tablets • Writing uncompressed binary is 30x faster than writing in ascii • Are they using printf or something?! • Unless you’re writing aligned data, this bitwise stuff should kill your perf if you understand what you are doing, and it should be no slower than 2x-4x (ASCII is about 2-4x bigger)
Their stated results • Decompression reconstructs 60-90Ktris/s • Takes same time to construct scene in VRML as compressing it with their algo • If they would only compare to something not-terrible • Writing scene in compressed form is 10x faster than in uncompressed. • If you’re writing to disk or network, sure
The cool result • Optimality analysis of their algorithm • Number of triangulations of simply connected polygon of n+2 vertices • If enumerated and an index into triangulation is used, encoding requires log2(ceil(Cn)) bits. As n->inf expr-> 2
The cool result • Optimal fixed-length encoding 2bits per vertex • On some examples they do better • They have some evidence of better performance than this fixed length scheme • on highly tesselated models • Like a bunny subdivided 2 times to have 38,000 polys (~1.5 bits per tri) • Potentially like a modern game model? • Around 2.5 for other models
Triangle Mesh Compression Costa Touma, Craig Gotsman Technion - Israel Institute of Technology
Insight • In polygonal mesh that is orientable • Vertices incident on any mesh vertex may be ordered • Separation property • If you cut out a ring of a mesh, it separates it into 2 disjoint meshes: • set of vertices inside (may be empty) • set outside • Connectivity can be encoded by degree
Definitions • Vertex cycle • Cyclic sequence of vertices along tri edges • Active list • Vertex cycle at “wavefront” of encoding. Mesh divided into portion of mesh encoded and portion not encoded • Focus • Vertex in active list being processed
Step 1: Pick tri for active list Specify node degrees:“add 6, add 7, add 4”
Continue working with focus • Add 4, Add 8
And now focus is done • Add 5, Add 5
Active edge added twice: split • Add 5, Split 5
Algorithm • Start with triangle, active list of 3 vertices • Add n vertices (clockwise order) adjacent to current focus to active list with “add <n>” command • If active list intersects itself, it is split to two active list with a “split <offset>” command
Merge case • This deals with genus 1+ objects (torus,etc) • If first free edge of active vertex is in active list of vertex, 2 possibilities • It is on current active list • Split <offset> • It is on active list already split • Merge <index> <offset>
Better prediction of vertex position • Have previous triangle • Compute plane equation • Assume next triangle is coplanar • Encode error term • Simple, elegant, low error • Use codebook for most common errors
Results • For regular meshes • Get around .2 bits per vertex for topology • With RLE • Increasing quantization from 8-10 bits, size goes up by 30-40% (!?)
Decompression • Leaf triangle reconstructed from root id