• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

Direct3D11 공부 23일차(Skinning)

29 Jun 2021

Reading time ~1 minute

Skinning

사람의 피부를 보면 관절 부분을 움직일때 피부가 늘어나는 것을 볼 수 있다. 이런 피부처럼 표현해주는게 스키닝이다.

이 스키닝에는 가중치기법이 많이 사용된다.

A와 B를 접는 부분일 때, 얼마만큼 가중치를 둬 많이 늘어나고 조금 늘어날지 정해준다.

V_world = V_local * M[INDEX0] * W_0 + V_local * M[INDEX1] * W_1 + …. V_local * M[INDEXn] * W_n

이런 식으로 가중치를 곱해서 넣어준다.

뭔지 모르겠으니까 하나하나 풀어보자

V_world 

= V_local(메시의 로컬좌표) * M_world(메시의 월드행렬) * M_world의 역행렬(본의 월드의 역행렬) * M_Animation(본의 애니메이션 월드행렬) * W_0( 0번째 가중치값 )

V_local * M_world(메시의 월드 행렬)을 통해 우선 메시의 월드 공간으로 정점을 옮겨준다. 그리고 M_world의 역행렬을 통해 본의 좌표 공간으로 옮길 수 있다. 메시와 본은 각각 자신의 로컬좌표계 기준을 갖고있기 때문이다.

여기서 본의 애니메이션 월드 행렬을 곱해주면 애니메이션 행렬연산을 적용 받을 수 있게 된다. 그리고 가중치를 곱해주면 스키닝 행렬을 구한 것이다.

1 0 0 0
0 1 0 0
0 0 1 0
2 0 0 1

이런 행렬일 있을때 이 행렬이 0.5의 가중치를 갖고있다 하면 곱해준다.

0.5 0.0 0.0 0.0
0.0 0.5 0.0 0.0 
0.0 0.0 0.5 0.0
1 0.0 0.0 0.0.5

이런 식으로 계산이 되고 이 본에 영향을 받는 것들을 합하면 가중치가 1로 나온다.



DirectX Share Tweet +1