Game Development Reference

In-Depth Information

Taking the derivative
∂/∂A
lm
to the
lm
component of the matrix
A
yields

∂...

∂A
lm

=2
A
lm
q
m
q
m
−

2
p
l
q
m
.

Writing this again in matrix-vector notation, we get

2
(
Aq
)
q
T

−
pq
T
,

and setting the derivative to zero brings us to

Aqq
T

pq
T

−

=0

=
pq
T

(
qq
T
)
−
1
.

→

A

·

Doing this calculation with the whole sum and the mass-weights would bring us

to

A
=

i

−
1

m
i
p
i
q
i

m
i
q
i
q
i

.

i

This is great because this is a quantity we can actually calculate.

The second part we can throw away because it is symmetric and, thus, cannot

contain a rotation. The rest of the expression we call
A
pq
. Just do the math:

A pq = zeroMatrix();

for
each vertex v in v i.neighbors
{

q=v.restPos

−

cm 0;

p = v.pos
−
cm;

for
all entries j, k

{

A pq[j][k] +=

v.mass

∗

p[k]

∗

q[j];

}

}

By so-called polar decomposition, we are now able to decompose the matrix

A
pq
into a rotation
R
and a scaling
S
:

A
pq
=
RS
.

How the scaling can be obtained can be understood intuitively: if we apply

A
pq
to a unit vector, the rotational part
R
will rotate the vector on the unit sphere,

but the scaling
S
will displace it from the shell of the unit sphere. Now we apply

A
pq
: the rotational part
R
T
will rotate the vector back to the original position,