Project archive

Dynamic mesh compression

This project focuses on size reduction of dynamic meshes. A dynamic mesh is a sequence of static triangular meshes of equal connectivity, describing the temporal development of a physical surface. Compression of such data is similar to static mesh compression, with two extra constraints:

People

Publications

Achievements

We view the input as a set of vertex trajectories. Principal Component Analysis of the trajectory set yields a new basis; most coordinates in that basis can be neglected, giving a 70–90% reduction of dimensionality without losing more than about one percent of the original variance.

Parallelogram prediction of PCA coefficients then reduces residual entropy. Residuals are quantized and sent to the decoder. This idea was published as CoDDyAC.

A later extension adds a simplification step by vertex decimation, performed by encoder and decoder after transmitting connectivity and before geometry. Geometry is sent in inverse decimation order, so vertices are added into fully known neighbourhoods. Extrapolation is replaced by more precise interpolation, and the stream becomes scalable.

An RBF-based interpolation predictor reduced data rate by about 25%. Because PCA combination coefficients predict well, the orthonormal PCA basis dominates the stream. Importance-dependent quantization plus motion-based prediction reduced encoded basis size by about 90% (COBRA).

Standard distortion metrics (MSE, DA error) correlate poorly with perceived distortion of dynamic meshes. Subjective tests led to the STED error, with Pearson correlation around 0.95; details are in thePh.D. thesis.

Results

Rate–distortion curves for two testing models. Rate is in bits per frame per vertex; error follows Karni and Gotsman. Comparison is against FAMC (part of the MPEG standard).

Dance model

Rate-distortion curve for the dance model

Cow model

Rate-distortion curve for the cow model

Downloads

A set of modules for the MVE-2 environment is useful for developing new dynamic mesh compression algorithms. The current compressor is not included; the library covers:

The package also contains two example maps, one for compression evaluation and one for playback of VRML files. See the original project download atMeshCompression.zip if present on the server.

A note on comparisons

There is a small ambiguity in the interpretation of the KG error (Karni, Gotsman: “Compression of soft body animation sequences”). The C# fragment below is the consensus procedure used in this work. The same note appears on the KG error page.

int pointCount = ((UnstrGrid)input1[0]).Points.Count;
int frameCount = input1.Count;

double[,] means = new double[frameCount, 3];
for (int i = 0; i < pointCount; i++)
{
    for (int j = 0; j < frameCount; j++)
    {
        TriangleMesh mesh = (TriangleMesh)input1[j];
        Point3D point = (Point3D)mesh.Points[i];
        means[j, 0] += point.X;
        means[j, 1] += point.Y;
        means[j, 2] += point.Z;
    }
}
for (int i = 0; i < frameCount; i++)
{
    means[i, 0] /= pointCount;
    means[i, 1] /= pointCount;
    means[i, 2] /= pointCount;
}

double s1 = 0;
double s2 = 0;

for (int i = 0; i < frameCount; i++)
{
    UnstrGrid frame1 = (UnstrGrid)input1[i];
    UnstrGrid frame2 = (UnstrGrid)input2[i];

    UniformDataArray points1 = frame1.Points;
    UniformDataArray points2 = frame2.Points;
    for (int j = 0; j < pointCount; j++)
    {
        Point3D p1 = (Point3D)points1[j];
        Point3D p2 = (Point3D)points2[j];
        s1 += (p1.X - p2.X) * (p1.X - p2.X);
        s1 += (p1.Y - p2.Y) * (p1.Y - p2.Y);
        s1 += (p1.Z - p2.Z) * (p1.Z - p2.Z);
        s2 += (p1.X - means[i, 0]) * (p1.X - means[i, 0]);
        s2 += (p1.Y - means[i, 1]) * (p1.Y - means[i, 1]);
        s2 += (p1.Z - means[i, 2]) * (p1.Z - means[i, 2]);
    }
}
result = new Scalar((Math.Sqrt(s1) / Math.Sqrt(s2)) * 100);

SetOutput("KG error", result);