As-Rigid-As Possible Surface Modeling

sjw0325·2023년 1월 16일
0

ARAP은 메쉬 변형 알고리즘이다. CGAL에도 구현되어있고, python으로도 Open3D 통해서 사용할 수 있다. Vertex 수천개 정도 스케일에서는 꽤 빠르게 돌아가는 편이다.

ARAP으로 변형한 Armadillo. 오른쪽 그림에서 오른쪽 다리의 빨간 점들이 fixed point이고 왼손의 노란 점이 handle이다.

배경

두 surface 사이의 차이는 shell energy라는 것을 통해 측정할 수 있는데

Es(S,S)=ΩksIIF2+kbIIIIF2E_s(\mathcal{S},\mathcal{S}')=\int_{\Omega}k_s\|\mathbf{I}'-\mathbf{I}\|^2_F+k_b\|\mathbf{II}'-\mathbf{II}\|^2_F

I\mathbf{I}II\mathbf{II}는 각각 first, second fundamental form이다. I\mathbf{I}은 surface의 strechting과 관련 있고, II\mathbf{II}는 bending과 관련 있다. 따라서 만약 surface S\mathcal{S}S\mathcal{S}'사이의 deform이 rigid하면 shell energy는 0이다. Non-rigid 한 deform을 찾을 때에도, shell energy가 0은 아니더라도 최소화 되도록 찾으면 (as-rigid-as possible 하게), local한 shape이 유지될 수 있다.

Cell Ci\mathcal{C}_i (여기선 vertex ii의 one-ring neighborhood로 정의)와 deform된 버전 Ci\mathcal{C}_i'에 대해 deformation이 rigid하다면 rotation matrix Ri\mathbf{R}_i

pipj=Ri(pipj),jN(i)\mathbf{p}'_i-\mathbf{p}'_j=\mathbf{R}_i(\mathbf{p}_i-\mathbf{p}_j), \forall j\in \mathcal{N}(i)

로 나타낼 수 있다. pi\mathbf{p}_i는 vertex 좌표. N(i)\mathcal{N}(i)는 vertex ii의 neighborhood (참고로,
jN(i)\forall j\in \mathcal{N}(i)에 대해 iN(j)i\in\mathcal{N}(j)이므로 cell들은 overlapping되어 있다.). Deformation이 non-rigid면 deform을 제일 잘 approximation하는 Ri\mathbf{R}_i는 아래의 weighted square를 minimize하는 것이다.

E(Ci,Ci)=jN(i)wij(pipj)Ri(pipj)2E(\mathcal C_i,\mathcal C'_i) = \sum_{j\in\mathcal N(i)}w_{ij}\|( \mathbf{p}'_i-\mathbf{p}'_j)-\mathbf{R}_i(\mathbf{p}_i-\mathbf{p}_j)\|^2

pipj\mathbf{p}_i-\mathbf{p}_jeij\mathbf{e}_{ij}로 적자. 그럼 위 식은 다시 쓰면

jwij(eijRieij)T(eijRieij)=jwij(eijTeij2eijTRieij+eijTeij)\sum_j w_{ij}(\mathbf{e}'_{ij}-\mathbf{R}_i\mathbf{e}_{ij})^T(\mathbf{e}'_{ij}-\mathbf{R}_i\mathbf{e}_{ij})=\sum_j w_{ij}(\mathbf{e}'^T_{ij}\mathbf{e}'_{ij}-2\mathbf{e}'^T_{ij}\mathbf{R}_i\mathbf{e}_{ij}+\mathbf{e}^T_{ij}\mathbf{e}_{ij})

나머지 항은 상수니까 Ri\mathbf{R}_i을 포함하는 term만 minimize할 수 있는데,

arg minRij2wijeijTRieij=arg maxRijwijeijTRieij\argmin_{\mathbf{R}_{i}} \sum_j -2w_{ij}\mathbf{e}'^T_{ij}\mathbf{R}_i\mathbf{e}_{ij} = \argmax_{\mathbf{R}_{i}} \sum_j w_{ij}\mathbf{e}'^T_{ij}\mathbf{R}_i\mathbf{e}_{ij}

Weighted inner product를 trace를 사용한 형태로 변형시키면 (Tr(yxT)=xTyTr(\mathbf{y}\mathbf{x}^T)=\mathbf{x}^T\mathbf{y}),

=arg maxRiTr(jwijRieijeijT)=arg maxRiTr(RijwijeijeijT)=\argmax_{\mathbf{R}_{i}} Tr\left(\sum_j w_{ij}\mathbf{R}_i\mathbf{e}_{ij}\mathbf{e}'^T_{ij}\right)=\argmax_{\mathbf{R}_{i}} Tr\left(\mathbf{R}_i\sum_j w_{ij}\mathbf{e}_{ij}\mathbf{e}'^T_{ij}\right)

이다.

Si=jN(i)wijeijeijT=PiDiPiT\mathbf{S}_i=\sum_{j\in\mathcal{N}(i)} w_{ij}\mathbf{e}_{ij}\mathbf{e}'^T_{ij}=\mathbf{P}_i\mathbf{D}_i\mathbf{P}'^T_i

Si\mathbf{S}_ieij\mathbf{e}_{ij}로 구성된 3×N(i)3\times|\mathcal{N}(i)| 행렬 Pi\mathbf{P}_iwijw_{ij}로 구성된 N(i)×N(i)|\mathcal{N}(i)|\times|\mathcal{N}(i)| 대각행렬 Di\mathbf{D}_i를 이용해서 쓸 수 있다. 만약 행렬 M\mathbf{M}이 PSD이면 어느 orthogonal 행렬 R\mathbf{R}에 대해서도 Tr(M)Tr(RM)Tr(\mathbf{M})\geq Tr(\mathbf{RM})이므로, RiSi\mathbf{R}_i \mathbf{S}_i를 symmetric PSD로 만드는 행렬 Ri\mathbf{R}_iTr(RiSi)Tr(\mathbf{R}_i\mathbf{S}_i)를 maximize한다. 그러한 Ri\mathbf{R}_i 는 SVD해서 (Si=UiΣiViT\mathbf{S}_i = \mathbf{U}_i \mathbf{\Sigma}_i\mathbf{V}^T_i)

Ri=ViUiT\mathbf{R}_i=\mathbf{V}_i \mathbf{U}^T_i

를 통해서 구할 수 있다.

구체적인 메소드

앞에서 정의했던 cell에 대한 에너지를 전체 surface에 대해 합하면

E(S)=i=1nwiE(Ci,Ci)=iwijN(i)wij(pipj)Ri(pipj)2E(\mathcal{S}')=\sum^n_{i=1}w_i E(\mathcal{C}_i, \mathcal{C}'_i)=\sum_i w_i\sum_{j\in\mathcal N(i)}w_{ij}\|( \mathbf{p}'_i-\mathbf{p}'_j)-\mathbf{R}_i(\mathbf{p}_i-\mathbf{p}_j)\|^2

이 때, weight wiw_iwijw_{ij}를 어떻게 골라야 할까? Deformation energy가 최대한 mesh-independent 하기 위해서 (특히 이 경우 non-uniform한 cell의 영향을 줄이기 위해서) cotangent weight을 사용한다.

wij=(cotαij+cotβij)/2w_{ij}=(\cot \alpha_{ij}+\cot \beta_{ij})/2

α\alphaβ\betae\mathbf{e}에 마주보고 있는 angle이다. Computing Discrete Minimal Surfaces and Their Conjugates을 참조하면 Dirichlet energy란 함수가 얼마만큼 변화하는가에 대한 measure이다(ED(f)=12Ωf2E_{D}(f)=\frac{1}{2}\int_{\Omega}|\nabla f|^2). 이런 surface에서 angle-preserving 한 mapping을 구하려면, 얼마만큼 Cauchy-Riemann equation을 만족하느냐를 나타내는 conformal energy라는 것을 사용하면 되는데, 이 conformal energy를 minimize하는 것이 Dirichlet energy 빼기 mapping area를 minimize하는 것과 동치라고 한다(https://math.stackexchange.com/questions/3213598/what-are-the-use-cases-of-the-dirichlet-energy-in-computer-vision 참조). 아무튼 계산해보면 triangle간의 linear map에 대한 Dirichlet energy가

ED(f)=14i=1edges(cotαi+cotβi)ei2E_D(f)=\frac{1}{4}\sum_{i=1}^{edges}(\cot\alpha_i + \cot\beta_i)|\mathbf{e}_i|^2

가 된다 한다. 이 내용을 ARAP에서 이용한 것이다. Cell energy가 cell area에 비례하는데 Voronoi area를 이용해서 normalize 해줄 수 있다.

우리가 ARAP을 통해 하고 싶은 것은 sparse한 user input을 constraint으로 두고, 나머지에 해당하는 vertex의 위치를 적절히 결정하고 싶은 것이다. 따라서 우리는 문제를 p\mathbf{p}’에 대해 풀어야한다. 또 R\mathbf{R} 역시 찾아야한다. 그래서 두 step으로 나눠서 한번은 R\mathbf{R}을 고정하고 p\mathbf p’를 찾고, 한번은 p\mathbf p’를 고정하고 R\mathbf R을 찾는다.

먼저 각 i에 대해 Ri\mathbf{R}_i을 찾는 것은 서로 독립적이므로 앞서 언급한 Si\mathbf{S}_i의 SVD를 이용한 방식으로 찾을 수 있다. (참고로, ARAP 외에 다른 deform 방식 중에는 이웃한 Ri\mathbf{R}_i 이 서로 비슷한 값을 갖도록 유도하는 것들도 있다.)

pi\mathbf{p}'_i는 partial derivate를 이용해서 찾을 수 있다.

E(S)pi=pi(jN(i)wij(pipj)Ri(pipj)2+jN(i)wji(pjpi)Rj(pjpi)2)=jN(i)2wij((pipj)Ri(pipj))jN(i)2wji((pjpi)Rj(pjpi))\frac{\partial E(\mathcal{S}')}{\partial\mathbf{p}'_i}=\frac{\partial }{\partial\mathbf{p}'_i}\left( \sum_{j\in\mathcal{N}(i)} w_{ij}\|( \mathbf{p}'_i-\mathbf{p}'_j)-\mathbf{R}_i(\mathbf{p}_i-\mathbf{p}_j)\|^2 + \sum_{j\in\mathcal{N}(i)} w_{ji}\|( \mathbf{p}'_j-\mathbf{p}'_i)-\mathbf{R}_j(\mathbf{p}_j-\mathbf{p}_i)\|^2\right) \\ = \sum_{j\in\mathcal{N}(i)} 2w_{ij}\left(( \mathbf{p}'_i-\mathbf{p}'_j)-\mathbf{R}_i(\mathbf{p}_i-\mathbf{p}_j)\right) -\sum_{j\in\mathcal{N}(i)} 2w_{ji}\left(( \mathbf{p}'_j-\mathbf{p}'_i)-\mathbf{R}_j(\mathbf{p}_j-\mathbf{p}_i)\right)

이 때, wij=wjiw_{ij}=w_{ji} 이므로

E(S)pi=jN(i)4wij((pipj)12(Ri+Rj)(pipj))\frac{\partial E(\mathcal{S}')}{\partial\mathbf{p}'_i} = \sum_{j\in\mathcal{N}(i)} 4w_{ij}\left(( \mathbf{p}'_i-\mathbf{p}'_j)-\frac{1}{2}(\mathbf{R}_i+\mathbf{R}_j)(\mathbf{p}_i-\mathbf{p}_j)\right)

derivative가 0이 되려면

jN(i)wij(pipj)=jN(i)wij2(Ri+Rj)(pipj)\sum_{j\in\mathcal{N}(i)} w_{ij}( \mathbf{p}'_i-\mathbf{p}'_j)=\sum_{j\in\mathcal{N}(i)} \frac{w_{ij}}{2}(\mathbf{R}_i+\mathbf{R}_j)(\mathbf{p}_i-\mathbf{p}_j)

왼쪽 term은 discrete Laplace-Beltrami operator가 p\mathbf p'에 적용된 형태임을 볼 수 있다. 따라서 Lp=b\mathbf{Lp}'=\mathbf{b} 꼴이고 Cholesky decomposition을 이용해서 빠르게 풀 수 있다. (https://en.wikipedia.org/wiki/Cholesky_decomposition 의 application 항목 첫번째 문단 참조)

앞서 이웃한 Ri\mathbf{R}_i 이 서로 비슷한 값을 갖도록 유도하는 것들도 있다고 했는데, 이 term을 ARAP에 더한 것이 Smoothed Rotation Enhanced As-Rigid-As Possible (SR_ARAP) Deformation 이고 cell energy term에 RiRjF2\|\mathbf{R}_i-\mathbf{R}j\|^2_{F}을 더한다.

0개의 댓글