본문 바로가기

Programming/DirectX

애니메이션 3

자 본애니에서 두종류의 애니가 있다고 말했다.


스티칭과 스키닝


다시 차이점을 이야기 한다면 버텍스 하나에 영향을 주는 본이 하나이냐 여러개나의 차이가

바로 스티칭과 스키닝의 차이점이다.


아 그래서 도대체 하나냐 여러개냐가 뭐가 문제냐 라고 생각한다면 그 차이점을 정확하게 설명하면

(사실 이런것은 그림으로 보면 좋은데...자료가 안보인다!!!!! )

하나만 영향을 받는다면, 특히 관절부분에서 관절을 접을때 매우 각이져서 뽀족하게 되지만, 여러개의 영향을 받게 되면 그 뽀족함이 덜해진다는 것이다.

이것은 바로 스티칭보다 스키닝이 점을 적게써도 더 좋은 효과를 낼수있다는 것을 의미한다.


왜냐 하면, 스티칭은 관절부분에 많은 버택스 추가해야 심하게 안꺽여 보이지만 스키닝은 적당히

몇개만 써도 부드럽게 할 수 있기때문이다.


자 오늘은 이 스키닝에 관해서 이야기 해보자.


스키닝은 위에서 말했다시피 하나의 점에 영향을 주는 본의 개수가 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계산을 하고 곱하면 끝이다.

일단 두번째 방식은 기본적으로 스티칭 애니과 구현방법이 비슷하고, 단순하기에 두번째것을 사용

한다. 일단 나의 추천방법이다.

'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