2012-05-09 4 views
0

스킨 메쉬를 분실)! 그래서 여기은</p> <p>드디어 GPU에 MD5와 스킨 메쉬에서 작동하는 시간을 가지고, 내가 가지 잃었어요

내가 할 것입니다 :

  • 이 빌드 바인드 포즈 메쉬

    • 로드 MD5MESH 파일 (이 단계가 제대로되어 - 지오메트리가 올바른지)

    • 이와 같이 bindpose와 inverse bindpose를 만듭니다 (접합 부분은로드 된 상태로 사용되며 부모에 의해 변형되지 않으므로 필요합니까?) :

      (각 프레임 관절은 다음과 같이 계산된다) 0
    • 로드 MD5ANIM 파일 :

         if(mAnimation->mJoints[i].mParent < 0) 
             { 
              mAnimation->mFrames[mFrameID][i].mPosition = _position; 
              mAnimation->mFrames[mFrameID][i].mOrientation = _orientation; 
             } 
             else 
             { 
              MD5FrameJoint *mParent = &mAnimation->mFrames[mFrameID][mAnimation->mJoints[i].mParent]; 
      
              float4 rpos = rotate(mParent->mOrientation, _position); 
      
              mAnimation->mFrames[mFrameID][i].mPosition = rpos + mParent->mPosition; 
              mAnimation->mFrames[mFrameID][i].mOrientation = mParent->mOrientation * _orientation;       
             } 
      
    • 각각의 프레임으로 현재 문제의 원인이되지 않습니다 지금 4 개 무게의 (즉, 최대처럼 뼈 매트릭스를 구축 I 간단한 모자이크 쿼드에 현장에서 불과 3 뼈가 -) 잘못 회전 :

      for(unsigned int i = 0; i < this->mJoints; i++) 
      { 
          const mat4 mTranslate = mat4(
           1, 0, 0, this->mFramePositions[mFrame][i].x, 
           0, 1, 0, this->mFramePositions[mFrame][i].y, 
           0, 0, 1, this->mFramePositions[mFrame][i].z, 
           0, 0, 0, 1); 
          const mat4 mRotate = mat4(this->mFrameOrientations[mFrame][i]); 
      
          this->mOutput[i] = mTranslate * mRotate; 
      } 
      
    • 을 그리고 (지금 CPU에 일을 같이 정점을 계산) GPU로 이동하고 싶습니다 :

      ,536,913을 63,210
       for(unsigned int j = 0; j < mSkinnedModel->mVertexCount[i]; j++) 
           { 
            float4 mResult = float4(0, 0, 0, 0); 
      
            float4 mPosition = float4(mSkinnedModel->mVertices[i][j].mPosition[0], 
                   mSkinnedModel->mVertices[i][j].mPosition[1], 
                   mSkinnedModel->mVertices[i][j].mPosition[2], 
                   1.0f); 
      
            for(unsigned int k = 0; k < 4; k++) 
            { 
             mResult += (mAnimatedBones[mSkinnedModel->mVertices[i][j].mBoneIndices[k]] * mPosition) * mSkinnedModel->mVertices[i][j].mBoneWeights[k]; 
            } 
      
            mBuffer[j].mPosition[0] = mResult.x; 
            mBuffer[j].mPosition[1] = mResult.y; 
            mBuffer[j].mPosition[2] = mResult.z; 
            mBuffer[j].mPosition[3] = 1.0f; 
           } 
      

    메쉬 + ANIM 파일입니다 (을 수출 및 3D 모델링 소프트웨어를 수입, 작품!) 올바른

    지금 내 수학 라이브러리가 좋아하고 지금까지 좋은 것 같다 여부를 테스트하고 있습니다 (행렬 반전도 좋다, 쿼터니언 곱셈도, 쿼터니언 테스트를 거친 행렬 ...)

    그리고 제게 어떤 기사를 가리 키지 말아주세요. 행렬 + 소스 코드가있는 GPU에서 MD5 스키닝을 사용하는 사람들)이 열었고 잘못된 점을 알아 냈으므로 지금까지 코드는 거의 내 것과 흡사합니다. 그것은 작은 작은 진절머리 나는 약간의 세부 일 것이다.

    누구나 전문가의 위치를 ​​알 수 있습니까?

  • +0

    MD5는 가장 일반적인 해시 알고리즘입니다. 나는 그 태그를 제거했다. – rekire

    답변

    3

    (너무 잘못되었습니다)!

    하나의 그림은 수천 단어의 가치가 있습니다. 너는 사진을 게시하지 않았다. 그래서, 당신은 무엇을 기대 했습니까?

    mat4 mBoneTranslation = mat4(
         1, 0, 0, mModel->mJoints[i].mPosition.x, 
         0, 1, 0, mModel->mJoints[i].mPosition.y, 
         0, 0, 1, mModel->mJoints[i].mPosition.z, 
         0, 0, 0, 1); 
    

    OpenGL 매트릭스입니까? OpenGL 매트릭스는 다른 방향을 가지며, 배치 된 모든 행렬을 저장하지 않는 한 DirectX에서 사용되는 D3DXMATRIX/D3DMATRIX와 완전히 동일합니다.

    비 전치 번역 매트릭스 : 물론, 비 전치 행렬 역 곱셈 위해 사용

    mat4 translation = mat4(
         1, 0, 0, 0, 
         0, 1, 0, 0, 
         0, 0, 1, 0, 
         x, y, z, 1); 
    

    그리고

    : 곱 대신 또한

    mat4 combined = rotation * translation; 
    

    는, 당신은 단순히 (마지막 행을 복사 할 수 있습니다 비 전치) :

    또는 열 (전치 됨). 이 부분에서 또한

    는 :

    this->mOutput[i] = mTranslate * mRotate; 
    

    당신은 역 뼈 계산으로 변환 포함 잊어 버렸습니다. Withotu 역 뼈 변환 스킨 메쉬는 "폭발"합니다.

    그것은해야한다 (전치 행렬)

    this->mOutput[i] = mTranslate * mRotate * mInverseMatrices[i]; 
    

    또는 (비는-전치 용).

    this->mOutput[i] = mInverseMatrices[i] * mRotate * mTranslate; 
    

    --EDIT--

    잘못 공동 계층 구조 변환 계산하는 것이 가능하다

    .

    { 
        MD5FrameJoint *mParent = &mAnimation->mFrames[mFrameID][mAnimation->mJoints[i].mParent]; 
    
        float4 rpos = rotate(mParent->mOrientation, _position); 
    
        mAnimation->mFrames[mFrameID][i].mPosition = rpos + mParent->mPosition; 
        mAnimation->mFrames[mFrameID][i].mOrientation = mParent->mOrientation * _orientation;       
    } 
    

    정상적으로 수행되는 방식이 아닙니다.

    모든 접합부에 대해 로컬 변환을 계산하십시오.

    this->localTransform = positionMatrix * rotationMatrix 
    

    계산 세계 객체 행렬 곱셈은 변환 부모 변환 및 아이 루트 노드 세계 들어

    this->worldTransform = parent->worldTransform * this->localTransform; 
    

    변환 곱하여 각 관절 변형 및 로컬 변환 (즉, 주변 메쉬 변환). 계층 구조 매트릭스 (ANY 매트릭스) 구성 요소를 확장 한 경우

    root->worldTransform = worldMatrix * root->localTransform; 
    

    당신의 방식은 제대로 작동하지 않습니다.

    이 방법이 도움이되지 않는다면 누군가 코드를 디버깅해야합니다. 나는 무료로 디버깅을하지는 않으나, SO에서 "프리랜서"서비스를 제공하는 것은 허용되지 않습니다 (AFAIK). 그래서 당신은 다른 누군가를 찾아야 할 것입니다.

    또 다른 점은 "흰색 점을 사용하여 \"이어야하는 위치를 나타내는 대신 애니메이션 md5 형식을 표시 할 수있는 응용 프로그램을 사용해야하며 올바르게 수행 할 수 있다는 것입니다. 흰색 점이 올바른 위치에 있지 않다는 보장은 없습니다.

    +0

    좋아요, 저는 다른 곳에 역행렬 곱셈을 가졌습니다. :) 어쨌든 행렬의 일부는 전치되었고 다른 전치되지 않은 행렬은 대부분의 이슈를 해결했습니다. (여전히 일부 정규화되지 않은 쿼터니온이 관련되어 있다고 생각합니다.) 나는 그들을 발견 할 수있다라고 생각한다) – ZarakiKenpachi

    +0

    So ... 나는 그것을 얻는다라고 생각한다 :) (그것은 지금 일하고있다. .. 만세!). 감사합니다. 매우 좋습니다! 게시물, 그것은 내게 많은 것들을 더 분명하게 보였다 : P. – ZarakiKenpachi