2015-01-13 14 views
0

게임에서 3D 스켈 레탈 애니메이션을 만드는 데 며칠 동안 노력했습니다. 나는 LWJGL과 함께 Java를 사용하고있다.스켈 레탈 애니메이션 : 바인드 포즈

애니메이션을 시도하기도 전에 프로그램에서 바인드 포즈를 얻으려고합니다. 블렌더에서 내보내는 콜라다 파일의 정보를로드합니다. 내 골격의 각 관절 : 나는 현재이 모든 내 게임에로드 한

  • 지역 매트릭스 (또한 공동 매트릭스 내 생각)
  • 역 바인드 모양 매트릭스
  • 부모 공동
  • 그 자식

골격이 aswell 루트 공동 모든 관절의 목록이 포함 된 계층 구조입니다 목록입니다. 또한 바인드 모양 행렬과 다른 행렬을 사용하고 있습니다.

각 스키닝 정보를 각 모델 (boneID 및 해당 가중치)에 대한 VBO로로드합니다.

인터넷에서 물건을 스키닝하는 것에 대해 많이 읽었지만 완전히 잃어 버렸습니다. 나는이 모든 매트릭스와 물건들로 무엇을해야하는지 잘 모른다. 여기

, 나는 그것이 괜찮아 확신 내가 내 현재의 정점 셰이더가 있습니다 : 여기

const int MAX_BONES = 32; 
in ivec4 boneIDs; 
in vec4 boneWeights; 
uniform mat4 boneTransforms[MAX_BONES]; 

void main(void) { 
    mat4 boneTransform = boneTransforms[boneIDs[0]] * boneWeights[0]; 
    boneTransform += boneTransforms[boneIDs[1]] * boneWeights[1]; 
    boneTransform += boneTransforms[boneIDs[2]] * boneWeights[2]; 
    boneTransform += boneTransforms[boneIDs[3]] * boneWeights[3]; 

    vec4 worldPosition = transformationMatrix * boneTransform * vec4(position, 1.0); 
… 

내 문제는 내가 행렬의 배열해야 모르는 것입니다. 나는 콜라다 파일에서 얻은 스키닝 정보에서로드 된 많은 수의 행렬을 가지고 있지만 그 관계가 무엇인지 함께 알지 못합니다.

나는 성공하지 않고 몇 가지 시도했다. 내 모델이 어떻게 보이는지, 그리고 현재 오른쪽에 보이는 것과 같은 그림이 있습니다. 쉐이더에 boneTransforms 배열에 포함

행렬들은 (I 스키닝 매트릭스 호출 것)은 다음과 같다 : 조인트

skinningMatrix = parentJoint.localMatrix * localMatrix * inverseBindShapeMatrix

인터넷에서이 작은 수식을 발견 했으므로 괜찮은지 모르지만 실제로는 잘 작동하지 않습니다.

답변

0

전송할 매트릭스를 확인하려면 먼저 이유를 이해해야합니다. 역 바인드 포즈 행렬은 부모 모서리가 원점이되도록 뼈 공간에 꼭지점을 가져옵니다. 그런 다음 뼈 공간에서 한 번, 꼭지점을 전역 행렬 (원하는 현재 포즈를 저장하는)에 곱하면 올바르게 회전하고 오프셋 한 후 올바른 공간으로 다시 가져옵니다. 그러나 두 개의 행렬 배열을 버텍스 쉐이더에 보내는 대신, 역행렬 및 현재 포즈 행렬을 결합하여 하나의 행렬로하여 버텍스를 곱할 수 있습니다. 그래서, 각 행렬에 대해, 현재의 포즈 행렬을 역순으로 (이 순서대로) 곱하는 행렬 배열을 만드십시오. 그런 다음 버텍스 쉐이더로 보냅니다.