본문 바로가기

Library/Computer Graphics

정점 혼합(Vertex Blending, a.k.a. Skinning)

3D로 모델링된 사람의 팔을 실제로 움직인다고 하자. 뼈는 강체(rigid)와 동일하게 생각할 수 있으므로, 뼈를 구성하는 폴리곤들은 단일한 변환 행렬에 의해 변환될 수 있다. 그러나, 팔에 피부를 구성하는 페이스들이 입혀져 있을 때, 이것을 뼈와 동일하게 변환한다면 변환 중 피부가 연결되지 않고 찢어지게 된다. 사람의 피부는 실제로 탄력성을 가지고 있기 때문에, 관절의 회전에 따라 피부의 늘어나는 비율이 그만큼 다르기 때문이다. 즉, 인체의 팔을 구성하는 피부의 경우, 3D로 표현할 때 하나의 변환 행렬로 표현할 수 없다.

정점 혼합(vertex blending)은 이 문제에 대한 해결 방법이다. 정점 혼합은 스키닝(skinning)과 같은 이름으로도 알려져 있는데, 정점에 적용되는 변환 행렬에 대해 가중치를 주는 방법이다. 수식으로 표현하면 다음과 같다.



여기서 p는 원래의 정점이고, u(t)는 그 위치가 시간 t에 따라 정해지는 변환된 정점이며, p의 위치에 영향을 주는 뼈가 n개 존재한다. 행렬 Mi는 원래 뼈의 좌표계로부터 월드 좌표계로 변환해준다. Bi(t)는 시간이 지남에 따라 움직이는 i번째 뼈의 월드 공간 변환으로써 일반적으로 이전의 골격 변환이나 지역 애니메이션 변환의 계층적 결합 등과 같은 다수의 행렬들이 결합되어 만들어진다. 마지막으로, Wi는 정점 p에 대한 i번째 뼈의 가중치이다. 가중치의 합은 1을 넘을 수 없다.

행렬 Mi는 스키닝에 대해 설명할 때 단독으로 나오지 않고 Bi(t)의 일부로 간주된다. 실제로, 행렬 Bi(t)와 Mi^-1는 하나로 결합되며, 애니메이션의 각 프레임에서 뼈마다 하나씩 만들어진다. 이렇게 결합된 행렬들이 정점들을 변환하는데 사용된다. 점 p에 서로 다른 여러 뼈들의 결합 행렬들을 적용하여 변환하고, 여기에 Wi라는 가중치를 곱한 후 모두 더한다. 그래서 이 기법을 정점 혼합이라고 부르는 것이다.

일반적으로, 정점 혼합에 사용되는 변환 행렬들은 3 ~ 4개 정도이며, 고전적인 3D 렌더링 파이프라인을 사용할 수도 있고, 쉐이더를 사용할 수도 있다.

정점 혼합은, 충돌 검사를 할 때 변환된 정점들의 정확한 좌표를 알기 위해 CPU에서의 연산이 필요할 수도 있다. 따라서, 어떤 방식으로 이것을 처리할 것인지 잘 판단해야 한다. 또, 이외에도 정점 혼합은 원하지 않는 접힘 현상, 비틀림, 자기 교차와 같은 문제를 가지고 있다.






Reference
Tomas Akenine-Moller, Eric Haines, Real time Rendering 2nd edition, A K Peters, Ltd.
신병석, 오경수 공역, 리얼타임 렌더링 2판, 정보문화사