자 본애니에서 두종류의 애니가 있다고 말했다.
스티칭과 스키닝
다시 차이점을 이야기 한다면 버텍스 하나에 영향을 주는 본이 하나이냐 여러개나의 차이가
바로 스티칭과 스키닝의 차이점이다.
아 그래서 도대체 하나냐 여러개냐가 뭐가 문제냐 라고 생각한다면 그 차이점을 정확하게 설명하면
(사실 이런것은 그림으로 보면 좋은데...자료가 안보인다!!!!! )
하나만 영향을 받는다면, 특히 관절부분에서 관절을 접을때 매우 각이져서 뽀족하게 되지만, 여러개의 영향을 받게 되면 그 뽀족함이 덜해진다는 것이다.
이것은 바로 스티칭보다 스키닝이 점을 적게써도 더 좋은 효과를 낼수있다는 것을 의미한다.
왜냐 하면, 스티칭은 관절부분에 많은 버택스 추가해야 심하게 안꺽여 보이지만 스키닝은 적당히
몇개만 써도 부드럽게 할 수 있기때문이다.
자 오늘은 이 스키닝에 관해서 이야기 해보자.
스키닝은 위에서 말했다시피 하나의 점에 영향을 주는 본의 개수가 N 개인것을 말한다.
사실 N개라지만 보통 2~3개정도로 한다. 4개 이상은 잘 안쓴다. ( 써도 안된다. 그래퍼를 닥달해서
라도 줄이자. 아니면 버택스수를 확 줄이던가.. )
이 스키닝 방식은 두가지가 있다. 오프셋 벡터를 쓰는법과 통합행렬로 구하는 방법. 이 두가지다.
오프셋 벡터를 쓰는 법은 이렇다.
스티칭 애니에서 버텍스들은 단 하나의 본에 영향을 받기때문에, 속도를 위해서 우선적으로
영향을 주는 본 값의 역행렬을( 본은 곳 TM(변화행렬) ) 곱해둔다.
하지만 이 스키닝은 영향을 주는 본의 개수가 하나가 아니기 때문에 미리 역행렬을 곱해놓을수
없다. 수학식으로 놓으면 이렇다.
스티칭
결과V = 월드 V * INV( 기본TM ) * 애니TM
스키닝
결과V = (월드 V * INV( 기본TM_1 ) * 애니TM_1 ) * 영향치_1 + ( 월드 V * INV( 기본TM_2 ) * 애니TM_2 ) * 영향치_2 ... + ( (월드 V * INV( 기본TM_n ) * 애니TM_n ) * 영향치_n
위 스키닝에서 영향치 의 모든 합은 1.0이 되야한다는 전제가 있다.
( 당연히 그런 것이지만 특이한 애니를 하기위해서 넘치기도 한다. )
보는바와 같이 애니TM은 애니변화 값에 따라서 매프레임 달라지는 것이지만 기본TM은 언제나
같은 TM이라서 스티칭은 (월드V * INV( 기본 TM ) ) 을 묵어서 ( INV 결과 V ) 로 치환해도 문제가
없지만, 스키닝은 치환시킬 방법이 없는 것이다.
그래서 나온것이 오프셋벡터이다.
( 여기서 잠시. 현재 공부가 부족하여, 정말 이게 오프셋벡터인지는 장담 할 수 가 없다.
일단 이해한 방법으로 설명하겠지만, 나 자신도 현재 오프셋벡터로 구현을 해보지도 않았다.
일단 방법이 내가 판단하기에 별로 좋아 보이지 않기 때문이다. 즉 내가 틀리게 이해한 것일
수 도있다. )
위 역행렬을 곱해놓듯이 각 ( 월드 * INV( 기본TM_1 ) ) 를 Offset V_1 로 변환해서
OffsetV_1 * 애니TM * 영향값_1 로 변환하는것이다.
일단 이것의 장점은 보는바와 같이 역행렬 곱하기 한번이 줄어든다는 것이다.
영향값이 많으면 그 수만큼의 역행렬을 줄일수있다.
또하나의 방법은
결과V = (월드 V * INV( 기본TM_1 ) * 애니TM_1 ) * 영향치_1 + ( 월드 V * INV( 기본TM_2 ) * 애니TM_2 ) * 영향치_2 ... + ( (월드 V * INV( 기본TM_n ) * 애니TM_n ) * 영향치_n
위 공식을 조금 다르게 풀면
결과V = 월드 V * ( ( INV( 기본TM_1 ) * 애니TM_1 ) * 영향치_1 ) + ( INV( 기본TM_2 ) * 애니TM_2 ) * 영향치_2 ) ... + ( INV( 기본TM_n ) * 애니TM_n ) * 영향치_n )
가 된다.
자 위의 월드 V 외 부분을 모두 모아서 하나의 TM으로 만드는 것이다.
여러가지 매트릭스 연산이 약간 좀 많이 되겠지만 일단 하나의 TM으로 만들기때문에 한 프레임에
한번만 구하면 된다는 장점이 있다. (이것이 매트릭스의 마법같은 일이다. )
위 두가지 방법중 현재 나는 밑에 것만 사용했다.
일단 위에 말했듯이 (내가 이해한대로라면) offset 벡터 사용은 영향값이 같은 것을 합 칠 수 없다는
단점이 존재한다.
이것은 무엇을 뜻하는가 하면 아래와 같은 영향값 정보가 있다고 보자.
영향값
영향 본 2 영향치 0.5
영향 본 3 영향치 0.3
영향 본 4 영향치 0.2
끝
위 영향값을 쓰는 버텍스가 5 개라고 할때 오프셋벡터는 각 버텍스마다 오프셋벡터가 3개가 필요로
하게된다. ( 총 5 * 3 의 벡터가 소요 )
하지만 두번째 방법은 한번의 TM계산을 하고 곱하면 끝이다.
일단 두번째 방식은 기본적으로 스티칭 애니과 구현방법이 비슷하고, 단순하기에 두번째것을 사용
한다. 일단 나의 추천방법이다.
[출처] 캐릭터 애니메이션 3 - 스키닝! 그놈에 관하여!|작성자 샤르봉
'Programming > DirectX' 카테고리의 다른 글
애니메이션 1 (0) | 2009.11.09 |
---|---|
애니메이션 2 (0) | 2009.11.09 |
애니메이션 4 (0) | 2009.11.09 |
내적(dot product) 외적(cross product) 이용 (0) | 2009.11.06 |
방향넣으면 각도 출력하는 함수 (0) | 2009.11.06 |