2015-01-03 2 views
0

colladas를 사용하는 스켈 레탈 애니메이션의 경우, 2 개의 행렬을 선형 적으로 보간해야합니다. 매트릭스 사이를 보간하기 위해 쿼터니언을 사용할 수있는 곳을 보았습니다.하지만 회전 구성 요소에서만 작동하며 변환을 보존해야합니다.2 개의 4x4 행렬 사이의 보간

float total = (orderedBones[i]->Animation->keyFrames[nextKeyFrame] - orderedBones[i]->Animation->keyFrames[nextKeyFrame - 1])*100.0; 
         float progress = orderedBones[i]->Animation->accumTime - (orderedBones[i]->Animation->keyFrames[nextKeyFrame - 1]*100.0); 
         float interpolation = progress/total; 

         glm::quat firstQuat = glm::quat_cast(orderedBones[i]->Animation->Matrices[nextKeyFrame - 1]); 
         glm::quat secondQuat = glm::quat_cast(orderedBones[i]->Animation->Matrices[nextKeyFrame]); 
         glm::quat finalQuat = glm::slerp(firstQuat, secondQuat, interpolation); 

         orderedBones[i]->Animation->interpoltaedMatrix = glm::mat4_cast(finalQuat); 

을 나는이 작업을 수행 할 수있는 방법이 있나요 : 여기에 번역 부분을 제외하고, 작품 내 코드는 무엇입니까?

+0

'quaternion' (단수) –

+0

@SeverinPappadeux 추가 : – BlueSpud

+0

은 무엇입니까 응답 콜라다? –

답변

2

나는 좀 더 웹 서핑을 통해 나의 질문을 해결했다. 나중에 참조 할 수있는 방법을 heres.

변형 성분이 같은 4 × 4 행렬에 저장된다

r r r t 
r r r t 
r r r t 
0 0 0 1 
R은 회전 구성 요소와

t는 병진 성분이다. 이 때문에 번역 요소를 벡터로 나타낼 수 있습니다. 2 개의 벡터는 선형 적으로 보간 될 수 있으므로 두 벡터를 보간 한 다음 완료되면 다시 회전 행렬에 넣습니다. Heres는 마지막 코드,하지만 조금 지저분한 :

float total = (orderedBones[i]->Animation->keyFrames[nextKeyFrame] - orderedBones[i]->Animation->keyFrames[nextKeyFrame - 1])*ANIMATION_MULTIPLICATION_CONST; 
         float progress = orderedBones[i]->Animation->accumTime - (orderedBones[i]->Animation->keyFrames[nextKeyFrame - 1]*ANIMATION_MULTIPLICATION_CONST); 
         float interpolation = progress/total; 


         glm::quat firstQuat = glm::quat_cast(orderedBones[i]->Animation->Matrices[nextKeyFrame - 1]); 
         glm::quat secondQuat = glm::quat_cast(orderedBones[i]->Animation->Matrices[nextKeyFrame]); 
         glm::quat finalQuat = glm::slerp(firstQuat, secondQuat, interpolation); 

         orderedBones[i]->Animation->interpoltaedMatrix = glm::mat4_cast(finalQuat); 

         glm::vec4 transformComp1 = glm::vec4(orderedBones[i]->Animation->Matrices[nextKeyFrame - 1][0][3],orderedBones[i]->Animation->Matrices[nextKeyFrame - 1][1][3],orderedBones[i]->Animation->Matrices[nextKeyFrame - 1][2][3],orderedBones[i]->Animation->Matrices[nextKeyFrame - 1][3][3]); 
         glm::vec4 transformComp2 = glm::vec4(orderedBones[i]->Animation->Matrices[nextKeyFrame][0][3],orderedBones[i]->Animation->Matrices[nextKeyFrame][1][3],orderedBones[i]->Animation->Matrices[nextKeyFrame][2][3],orderedBones[i]->Animation->Matrices[nextKeyFrame][3][3]); 

         glm::vec4 finalTrans = (float)(1.0-interpolation)*transformComp1+transformComp2*interpolation; 


         //good for now, although in future the 2 transformation components need to be interpolated 
         orderedBones[i]->Animation->interpoltaedMatrix[0][3] = finalTrans.x; 
         orderedBones[i]->Animation->interpoltaedMatrix[1][3] = finalTrans.y; 
         orderedBones[i]->Animation->interpoltaedMatrix[2][3] = finalTrans.z; 
         orderedBones[i]->Animation->interpoltaedMatrix[3][3] = finalTrans.w; 

희망 누군가 다른 사람의 질문 :

내가 태그를 추가 제안