11.08

신승빈·2022년 11월 8일
0

KGCA 수업

목록 보기
73/128

Character Animation

과정 : 모델링-리깅-키 애니메이션
모델링을 완성한 후 애니메이션을 위해 버텍스나 폴리곤을 직접 조작하는 것은 효율이 안좋기 때문에, 모델링이 완성된 Mesh에 Bone을 리깅하여 애니매이션 시 Bone만 조작하는 방식
이 때, 부드러운 피부 표현을 위해 1개의 Mesh Vertex에 다수의 Bone과 Weight를 이용하여 Vertex의 위치를 계산하는 것을 Skinning이라 함

Reference : https://www.youtube.com/watch?v=tMjHWakXXhg

Skinning

VWorld=i=0i<n(VLocalM[i]W[i])V_{World} = \sum _{i = 0} ^{i < n} (V_{Local} * M[i] * W[i])
M[i]=Bone의이동행렬M[i] = Bone의 이동 행렬
W[i]=Bone에대한가중치W[i] = Bone에 대한 가중치
W[i]=1\sum W[i] = 1

주의사항

FBX Mesh의 Vertex는 기본적으로 World Coordinate로 잡혀있기 때문에 Bone에 의한 애니메이션을 계산할 때에는 Bone 좌표계로 변환한 후 수행해야 함
또한, FBX Mesh의 Vertex와 Bone의 좌표가 일치한다고 보장힐 수 없으므로 FBX Mesh의 World Coordinate와 Bone의 World Coordinate를 일치시켜줘야 한다

FBX에서의 엄밀한 계산식

VWorld=i=0i<n(VLocalToBoneSpace[i]BoneAnimation[i]Weight[i])V_{World} = \sum _{i = 0} ^{i < n} (V_{Local} * ToBoneSpace[i] * BoneAnimation[i] * Weight[i])

FbxAMatrix linkMatrix;
cluster->GetTransformLinkMatrix(linkMatrix);	// Bone World Matrix

FbxAMatrix adjustMatrix;
cluster->GetTransformMatrix(adjustMatrix);		// FBX Mesh와 Bone의 오차 조정

// Mesh World Coordinate를 Bone Space로 변환한 후, Mesh와 Bone의 오차를 조정하는 Matrix
FbxAMatrix fbxBoneSpaceMatrix = linkMatrix.Inverse() * adjustMatrix;
HMatrix44 toBoneSpaceMatrix = Convert(fbxBoneSpaceMatrix);
object->SetBoneSpaceTransformMatrix(boneIndex, toBoneSpaceMatrix);
Reference : https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jidon333&logNo=220264383892
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글