As-Rigid-As-Possible.
\[
\Psi = \frac{\mu}{2} \|F - R\|_F^2 = \frac{\mu}{2} (I_2 - 2 I_1 + 3)
\]
Functions:
arap_energy_density
Source code in src/liblaf/apple/func/elastic/arap.py
| @no_type_check
@wp.func
def arap_energy_density(F: mat33, mu: float) -> float:
R, S = utils.polar_rv(F)
Psi = 0.5 * mu * utils.frobenius_norm_square(F - R)
return Psi
|
arap_energy_density_hess_diag
arap_energy_density_hess_diag(
F: mat33, mu: float, dh_dX: mat43
) -> mat43
Source code in src/liblaf/apple/func/elastic/arap.py
32
33
34
35
36
37
38
39
40
41 | @no_type_check
@wp.func
def arap_energy_density_hess_diag(F: mat33, mu: float, dh_dX: mat43) -> mat43:
U, sigma, V = utils.svd_rv(F)
lambdas = strain.lambdas(sigma=sigma) # vec3
Q0, Q1, Q2 = strain.Qs(U=U, V=V) # mat33, mat33, mat33
h4_diag = strain.h4_diag(dh_dX=dh_dX, lambdas=lambdas, Q0=Q0, Q1=Q1, Q2=Q2) # mat43
h5_diag = strain.h5_diag(dh_dX=dh_dX) # mat43
h = -2.0 * h4_diag + h5_diag # mat43
return 0.5 * mu * h
|
arap_energy_density_hess_quad
Source code in src/liblaf/apple/func/elastic/arap.py
44
45
46
47
48
49
50
51
52
53 | @no_type_check
@wp.func
def arap_energy_density_hess_quad(F: mat33, p: mat43, mu: float, dh_dX: mat43) -> float:
U, sigma, V = utils.svd_rv(F)
lambdas = strain.lambdas(sigma=sigma) # vec3
Q0, Q1, Q2 = strain.Qs(U=U, V=V) # mat33, mat33, mat33
h4_quad = strain.h4_quad(p=p, dh_dX=dh_dX, lambdas=lambdas, Q0=Q0, Q1=Q1, Q2=Q2)
h5_quad = strain.h5_quad(p=p, dh_dX=dh_dX) # float
h = -2.0 * h4_quad + h5_quad # float
return 0.5 * mu * h
|
arap_first_piola_kirchhoff_stress
arap_first_piola_kirchhoff_stress(
F: mat33, mu: float
) -> mat33
Source code in src/liblaf/apple/func/elastic/arap.py
| @no_type_check
@wp.func
def arap_first_piola_kirchhoff_stress(F: mat33, mu: float) -> mat33:
R, S = utils.polar_rv(F)
PK1 = mu * (F - R)
return PK1
|