# Mesh Parameterization¶


This tour explores 2-D parameterization of 3D surfaces using linear methods.

A review paper for mesh parameterization can be found in:

M.S. Floater and K. Hormann, Surface Parameterization: a Tutorial and Survey in Advances in multiresolution for geometric modelling, p. 157-186, 2005.

K. Hormann, K. Polthier and A. Sheffer Mesh parameterization: theory and practice, Siggraph Asia Course Notes

In [2]:
addpath('toolbox_signal')


## Conformal Laplacian¶

The conformal Laplacian uses the cotan weights to obtain an accurate discretization of the Laplace Beltrami Laplacian.

They where first introduces as a linear finite element approximation of the Laplace-Beltrami operator in:

U. Pinkall and K. Polthier, Computing discrete minimal surfaces and their conjugates Experimental Mathematics, 2(1):15-36, 1993.

First load a mesh. The faces are stored in a matrix $F = (f_j)_{j=1}^m \in \RR^{3 \times m}$ of $m$ faces $f_j \in \{1,\ldots,n\}^3$. The position of the vertices are stored in a matrix $X = (x_i)_{i=1}^n \in \RR^{3 \times n}$ of $n$ triplets of points $x_k \in \RR^3$

In [3]:
name = 'nefertiti';
n = size(X,2);
clear options; options.name = name;


In order to perform mesh parameterization, it is important that this mesh has the topology of a disk, i.e. it should have a single B.

First we compute the boundary $B = (i_1,\ldots,i_p)$ of the mesh. By definition, for the edges $(i_k,i_{k+1})$, there is a single adjacent face $(i_k,i_{k+1},\ell)$.

In [4]:
options.verb = 0;
B = compute_boundary(F, options);


Length of the boundary.

In [5]:
p = length(B);


Display the boundary.

In [6]:
clf; hold on;
plot_mesh(X,F,options);
hh = plot3( X(1,B),X(2,B),X(3,B), 'r' );
set_linewidth(hh,4);


The conformal Laplacian weight matrix $W \in \RR^{n \times n}$ is defined as $$W_{i,j} = \choice{ \text{cotan}(\al_{i,j}) + \text{cotan}(\be_{i,j}) \qifq i \sim j \\ \quad 0 \quad \text{otherwise}. }$$ Here, $i \times j$ means that there exists two faces $(i,j,k)$ and $(i,j,\ell)$ in the mesh (note that for B faces, one has $k=\ell$).

The angles are the angles centered as $k$ and $\ell$, i.e. $$\al_{i,j} = \widehat{x_i x_k x_j } \qandq \be_{i,j} = \widehat{x_i x_\ell x_j }.$$

Compute the conformal 'cotan' weights. Note that each angle $\alpha$ in the mesh contributes with $1/\text{tan}(\alpha)$ to the weight of the opposite edge. We compute $\alpha$ as $$\alpha = \text{acos}\pa{ \frac{\dotp{u}{v}}{\norm{u}\norm{v}} }$$ where $u \in \RR^3, v \in \RR^3$ are the edges of the adjacent vertices that defines $\al$.

In [7]:
W = make_sparse(n,n);
for i=1:3
i2 = mod(i  ,3)+1;
i3 = mod(i+1,3)+1;
u = X(:,F(i2,:)) - X(:,F(i,:));
v = X(:,F(i3,:)) - X(:,F(i,:));
% normalize the vectors
u = u ./ repmat( sqrt(sum(u.^2,1)), [3 1] );
v = v ./ repmat( sqrt(sum(v.^2,1)), [3 1] );
% compute angles
alpha = 1 ./ tan( acos(sum(u.*v,1)) );
alpha = max(alpha, 1e-2); % avoid degeneracy
W = W + make_sparse(F(i2,:),F(i3,:), alpha, n, n );
W = W + make_sparse(F(i3,:),F(i2,:), alpha, n, n );
end


Compute the symmetric Laplacian matrix $$L = D-W \qwhereq D = \diag_i\pa{\sum_j W_{i,j}}.$$

In [8]:
d = full( sum(W,1) );
D = spdiags(d(:), 0, n,n);
L = D - W;


## Fixed Boundary Harmonic Parameterization¶

The problem of mesh parameterization corresponds to finding 2-D locations $(y_i = (y_i^1,y_i^2) \in \RR^2$ for each original vertex, where $Y = (y_i)_{i=1}^n \in \RR^{2 \times n}$ denotes the flattened positions.

The goal is for this parameterization to be valid, i.e. the 2-D mesh obtained by replacing $X$ by $Y$ but keeping the same face connectivity $F$ should not contained flipped faces (all face should have the same orientation in the plane).

We consider here a linear methods, that finds the parameterization, that impose that the coordinates are harmonic inside the domain, and have fixed position on the boundary (Dirichlet conditions) $$\forall s=1,2, \quad \forall i \notin B, \quad (L y^s)_i = 0, \qandq \forall j \in B, \quad y^s_j = z_j^s.$$

In order for this method to define a valid parameterization, it is necessary that the fixed position $z_j = (z^1_j,z^2_j) \in \RR^2$ are consecutive points along a convex polygon.

Compute the fixed positions $Z=(z_j)_j$ for the vertices on $B$. Here we use a circle.

In [9]:
p = length(B);
t = linspace(0,2*pi(),p+1); t(p+1) = [];
Z = [cos(t); sin(t)];


Computing the parameterization requires to solve two independent linear system $$\forall s=1,2, \quad L_1 y^s = r^s$$ where $L_1$ is a modified Laplacian, the is obtained from $L$ by $$\choice{ \forall i \notin B, \quad (L_0)_{i,j} = L_{i,j} \\ \forall i \in B, \quad (L_0)_{i,i}=1, \\ \forall i \in B, \forall j \neq i, \quad (L_0)_{i,i}=0, }$$ i.e. replacing each row indexed by $B$ by a 1 on the diagonal.

In [10]:
L1 = L;
L1(B,:) = 0;
for i=1:length(B)
L1(B(i),B(i)) = 1;
end


Set up the right hand size $R$ with the fixed position.

In [11]:
R = zeros(2, n);
R(:,B) = Z;


Solve the two linear systems. For Scilab user: this might take some time ...

In [12]:
if using_matlab()
Y = (L1 \ R')';
else
options.maxit = 300;
Y(1,:) = perform_cg(L1,R(1,:)',options)';
Y(2,:) = perform_cg(L1,R(2,:)',options)';
end


Display the parameterization.

In [13]:
clf;
options.lighting = 0;
plot_mesh([Y;zeros(1,n)],F);


## Mesh Parameterization on a Square¶

One can perform a fixed B parameterization on a square. This is useful to compute a geometry image (a color image storring the position of the vertices).

Exercise 1

Compute the fixed positions $Z$ of the points indexed by $B$ that are along a square. Warning: $p$ is not divisible by 4.

In [14]:
exo1()

In [15]:
%% Insert your code here.


Exercise 2

Compute the parameterization $Y$ on a square.

In [16]:
exo2()