ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Linear Blend Skinning
    Human Shape Estimation 2020. 7. 6. 22:24

    이 글은 pixelfondue의 이 글을 바탕으로 일반인이 이해한 내용을 필기한 노트입니다.

    Linear Blend Skinning이란 어떤 3차원 물체를 컴퓨터 그래픽으로 형상화시킬 때에 사람의 뼈 구조(skeleton structure)로부터 Mesh를 만드는 기본적이고 널리 쓰이고 있는 방법입니다. 장점으로는 연산량이 많지 않으면서 적당한 mesh를 만들 수 있다는 점과, Translation이나 Rotation, Scaling과 같은 Transformation을 그대로 적용시킬 수 있는 점 등이 있습니다. 반대로 단점은 접히거나 꼬이는 부분에 대한 표현이 부자연스러울 수 있다는 것입니다.

    먼저 3차원 물체의 그래픽을 표현하는 방법은, 물체의 Vertex(점)들을 연결해서 여러 Polygon(면)들을 만들게 되는데, 이런 Polygon들이 하나로 모여서 만들어진 물체를 Mesh라고 부릅니다. 여기서 Vertex가 이동하게 되면 Mesh의 모양이 달라지게 됩니다. 이후 이 글을 읽으실 때에 Vertex 이동 = Mesh 이동으로 보시면 됩니다.

    1. 사용 방법

    사진 1. 2개의 Joint를 가지고 있는 기본적인 Cylinder Mesh

    예를 들어 위의 사진 1과 같은 3차원 물체가 있다고 가정합시다. 1번 점과 2번 점은 각각 관절(Joint)입니다. 이 Joint들은 Mesh들과 연결이 되어있어서, 각 Joint가 특정 Mesh 영역에 영향을 줄 수 있습니다. 이런 영역은 각 Joint들의 Weight Map으로 지정됩니다. 사진 1을 확인해보시면 Mesh 밑에 각 Joint가 영향을 끼치는 Mesh 영역이 표시되어 있습니다. 1번 Joint의 영향을 받는 Mesh들은 1번의 transformation에 따라서 동일하게 이동하게 되고, 2번 Joint의 영향을 받는 Mesh들도 2번의 transformation에 따라서 동일하게 이동하게 됩니다. 여기서 문제는 1번과 2번 Joint가 동시에 영향을 끼치는 부분인데, 이런 영역의 Mesh들에 대해 적용되는 알고리즘이 Linear Blend Skinning 알고리즘입니다.

    사진 2. 각 Joint의 Transformation에 따라서 Mesh들이 이동된 모습

    다음 사진 2는 각 Joint에 Rotation이 적용된 모습입니다. 먼저 1번 Joint의 영향만 받는 Mesh들은 1번의 Rotation만큼 동일하게 이동하고, 2번 Joint의 영향만 받는 Mesh들은 2번의 Rotation만큼 동일하게 이동해서 위와 같이 만들어집니다. 이 작업이 끝나면 두 Joint들의 영향을 동시에 받는 Mesh들에 대한 계산이 이루어집니다. 예를 들어 사진 1의 2번 Joint 바로 위에 있는 Vertex를 이동시킨다고 가정합시다. 

    사진 3. 빨간 점은 대상 Vertex가 1번 Joint의 영향만 받았을 경우의 결과이고, 파란 점은 대상 Vertex가 2번 Joint의 영향만 받았을 경우이다.

    그러면 위의 사진 3과 같이 대상 Vertex가 1번 Joint의 영향을 받아 이동한 결과와 2번 Joint의 영향을 받아 이동한 결과를 확인할 수 있습니다. 저 두 점을 한 선으로 이은 뒤, 해당 선 상에서 각 Joint의 Weight Map 값에 따라 Weight을 적용시켜서 최종 위치를 선정합니다. 여기서 Weight Map은 각 Joint가 해당 Mesh에 끼치는 영향력을 0~1 사이의 Wegith 값으로 나타낸 Map입니다. 만약 여러 Joint가 같은 Mesh에 영향력을 끼치면, 각 Joint의 Weight값의 합이 1이 되도록 지정합니다. 

    사진 4. 만약 대상 Vertex에 대한 Weight값이 1번과 2번 Joint가 동일하게 0.5였을 경우

    사진 4는 대상 Vertex에 대한 1번 Joint의 Weight값이 0.5이고 2번 Joint의 Weight값이 0.5였을 경우의 최종 위치를 나타냅니다. 두 점을 이은 선에 각 Joint의 Weight값을 적용시킨 결과 선의 가운데 지점이 대상 Vertex의 최종 위치가 됩니다. 이런 작업을 나머지 영역에 대해서 모두 반복시킨 결과가 사진 5입니다.

    사진 5. Linear Blend Skinning을 모두 적용시킨 결과

    위 방법은 보시다시피 매우 단순한 작업이기 때문에 연산량이 많지 않고, 적당한 결과를 만들 수 있습니다. 하지만 단순한 알고리즘이기 때문에 접히거나 꼬이는 부분에 대한 표현이 부자연스러워지는 단점이 있습니다. 

    2. 단점

    아래의 사진들은 이 글에서 받아온 사진입니다.

    사진 6. Linear Blend Skinning으로 표현된 3차원 물체가 접힌 경우

    사진 6은 접힌 3차원 물체를 Linear Blend Skinning으로 표현한 경우입니다. 보시면 접힌 안쪽 부분에 겹치는 Volume이 있는 것을 확인할 수 있는데, 현실 세계에서는 이런 경우 겹치는 부분이 옆으로 삐져나오거나 안 접히지만, Linear Blend Skinning은 겹친 대로 표현이 돼서 겹친 부분의 Volume이 사라지게 됩니다. 

    사진 7. Linear Blend Skinning으로 표현된 3차원 물체가 꼬인 경우

    사진 7은 꼬인 3차원 물체를 Linear Blend Skinning으로 표현한 경우입니다. 꼬인 경우에는 물체의 표면 면적 자체가 작아지면서 기존 Volume과 비교해서 많은 Volume이 사라진 것을 확인할 수 있습니다.

    위의 두 경우와 같이 Linear Blend Skinning을 그대로 사용하게 되면 3차원 물체의 Volume이 사라지는 경우가 있을 수 있습니다.

Designed by Tistory.