So the basic idea in this project is the following question: Why don't people look at meshes like they look at images when trying to compress them? Can't you just discretely sample the mesh on a grid using some sort of scheme and use a three dimensional Wavelet Transform on the result?
Of course, there's some problems that need looking into for this to work.
In this project, I looked at these problems, and came up with some ideas to see how feasible this method would be. Here is my proposal for this project in Postscript format.
Below are some images relating to this...
So, my first step was to come up with a simple sampling scheme and a reconstruction scheme, as those were the most important step to see the results for later sections. Thus far, my sampling schemes assume a closed surface with a definite inside & outside. However, this is easily changed I believe. My first scheme was very simple, a simple T/F for if the sample point was inside the mesh or not. My second scheme stored a distance to the surface from the point.
NOTE: I didn't finish my code for the triangle reconstructions before taking these images. That means there are some holes in the meshes (but the "chewed" ear is an effect of grid spacing).

![]() 128x128x128 samples A cube around each inside point |
![]() 128x128x128 samples Connect the outer surface of inside points |
![]() 128x128x128 samples Connect the surface using distance info |
![]() 64x64x64 samples A cube around each inside point |
![]() 64x64x64 samples Connect the outer surface of inside points |
![]() 64x64x64 samples Connect the surface using distance info |
![]() 32x32x32 samples A cube around each inside point |
![]() 32x32x32 samples Connect the outer surface of inside points |
![]() 32x32x32 samples Connect the surface using distance info |
![]() 16x16x16 samples A cube around each inside point |
![]() 16x16x16 samples Connect the outer surface of inside points |
![]() 16x16x16 samples Connect the surface using distance info |
Below are some results from compressing the above bunnies. Below, I used the 2nd triangle reconstruction method (on the right above), and I used the distance from the surface sampling method, which gives data sizes of 16,777,312 bytes for the 128x128x128 sampled grid, 2,097,245 bytes for the 64x64x64 sampled grid, and 262,237 bytes for the 32x32x32 sampled grid. Once again, there are some holes in the mesh relating to the fact that I didn't finish coding the trianglulation method for all cases.
Each row has the same compression parameter, just for different sized meshes. And the size below each image is the compressed grid's file size.
32x32x32 samples |
64x64x64 samples |
128x128x128 samples |
|---|---|---|
![]() 323 bytes | ![]() 666 bytes | ![]() 1,466 bytes |
![]() 895 bytes | ![]() 2,083 bytes | ![]() 4,674 bytes |
![]() 1,399 bytes | ![]() 3,192 bytes | ![]() 9,169 bytes |
![]() 2,942 bytes | ![]() 5,692 bytes | ![]() 15,945 bytes |
![]() 4,963 bytes | ![]() 12,031 bytes | ![]() 26,833 bytes |
![]() 6,507 bytes | ![]() 16,797 bytes | ![]() 44,677 bytes |
![]() 7,594 bytes | ![]() 20,768 bytes | ![]() 58,008 bytes |
![]() 8,463 bytes | ![]() 24,006 bytes | ![]() 68,138 bytes |
![]() 10,072 bytes | ![]() 29,966 bytes | ![]() 89,589 bytes |
![]() 11,308 bytes | ![]() 34,479 bytes | ![]() 105,997 bytes |
![]() 19,355 bytes | ![]() 63,194 bytes | ![]() 209,754 bytes |
![]() 25,651 bytes | ![]() 81,766 bytes | ![]() 258,983 bytes |
Here's another, more complex object and the results for my method.
![]() The original object (1+ million triangles, roughly 50 MB) | ![]() Sampled on a 256x256x256 grid (134 MB), used to compress for results below |
![]() ~1.5 kilobytes | ![]() ~9 kilobytes | ![]() ~14 kilobytes | ![]() ~22 kilobytes |
![]() ~50 kilobytes | ![]() ~143 kilobytes | ![]() ~180 kilobytes | ![]() ~500 kilobytes |
The dragon has fewer triangles, but has lots of interesting detail that can be easily lost.
![]() The original object ( ~875,000 triangles, 33 MB ) | ![]() Sampled on a 128x128x128 grid (16 MB), used to compress for results below | ![]() Sampled on a 128x128x128 grid with 3 values per point (50 MB) |
![]() ~1 kilobytes | ![]() ~7 kilobytes | ![]() ~13 kilobytes |
![]() ~29 kilobytes | ![]() ~52 kilobytes | ![]() ~80 kilobytes |
Last Modified: Sunday, April 22, 2001
Chris Wyman (wyman@cs.utah.edu)