KH_C++
스키닝(Skinning) 본문
[ Skinning ]
스키닝(skinning)이란 피부를 붙이는 작업이라고 말할 수 있다.
3차원 메쉬는 관절과 관절 사이가 사람과 달리 끊김 현상이 발생할 수 있는데 , 이를 막는 기법을 스키닝이라고 한다.
마치 사람의 뼈 위에 피부가 있어서 관절부위가 보이지 않는 것처럼 말이다. 과거에는 고급 기법이었으나, 요즘에는 스키닝이 되지 않는 경우가 더 어색해 보일정도로 일반화 되었다.
계산식 : V(최종 world) = V(스킨 world) * M0(월드 상에서 뼈가 움직인 만큼의 애니) * W0(가중치) ....
M0는 어떻게 구하는법은 일단 뼈의 움직임을 월드 상의 움직임으로 바꾸어야 한다.
뼈 AniTm을 그대로 적용하면 뼈가 A만큼 움직였다고 해서 스킨도 A만큼 움직이지지 않는다.
이유는 뼈 AniTm은 뼈의 로컬 정점이 월드에 적용되는 AniTm 값이기 때문에 이를 그대로 스킨의 로컬 정점에 적용하면 각 메시들의 변환 행렬의 차이로 다른 움직임을 보인다.그렇기 때문에 월드 상에서 뼈가 움직인 AniTm만큼 월드 상에 스킨 정점을 이동하는 방법을 찾아야 한다.
월드 상에서 시작 기준이 될 행렬 OffsetTm을 구한다
OffsetTm = 뼈의 초기 월드 행렬(움직임이 없는 고정된 상태에서 계산된 뼈 월드 행렬)의 역행렬
월드 상에서 뼈의 움직임 값을 구한다
(월드 상의 뼈 움직임) = OffsetTm * Bone AniTm
이를 월드 상의 정점에 적용
V(최종 world) = V(스킨 world) * (월드 상의 뼈 움직임)
소프트웨어스키닝 : 각 정점의 위치를 CPU를 사용하여 계산( 상단공식 ) 결과를 임시메시에 저장, 렌더
간단하고 직관적, 하드웨어 스키닝에 비해 속도 느리다.
그러나 렌더링할 객체가 메시의 형태로 메모리에 저장되므로 그림자캐스팅, 피킹 등의 추가 작업을 하기에 쉽고, 정점에 영향을 미치는 본의 수에 제한이 없다.
하드웨어스키닝 : 정점의 위치계산을 GPU에게 맡긴다. 그림자캐스팅, 피킹 등의 작업이 가능하나, 소프트웨어 스키닝보다 많은 노력 필요, 정점에 영향미치는 본의수, 1메시에 있는 캐릭터가 (물론 메시를 여러개로 쪼갠다면 많아질 수 있겠지만 ) 가질 수 있는 본의 수에 제한이 있다. 속도는 훨씬 빠르다는 장점
출처:
https://skmagic.tistory.com/18
'공부' 카테고리의 다른 글
그림자 매핑(Shadow Mapping) (0) | 2023.06.26 |
---|---|
노멀 매핑(Normal Mapping), 탄젠트 스페이스(Tangent Space) (0) | 2023.06.26 |
SIMD (Single Instruction Multiple Data) (0) | 2023.06.20 |
Ambient, Diffuse, Specular, Phong Reflection (1) | 2023.06.07 |
레이 캐스트(Ray Cast), 레이 트레이싱(Ray Tracing) (2) | 2023.06.01 |