8. [Skinning02]

#define NUM_WVERTEX 4

struct sSkinData
{
     int  NumWVertexs;                                                        // 가중치 개수
     float Weight[NUM_WVERTEX];                                       // 가중치
     cFrame* pBone[NUM_WVERTEX];                                 // 본
};

하나의 Vertex가 가지고 있는 가중치 정보다.
최대 4개의 본에 영향을 받고, 각각의 본에 대한 가중치값을 가지고 있다.

SkinData를 적용시키는 함수를 살펴보자

void cModel::ApplySkinData()
{
     m_pRoot->ApplySkinData();
}

// 스키닝 데이터 적용
void cFrame::ApplySkinData()
{
 int NumSkinData = m_vecSkinList.size();

 

 if(NumSkinData > 0)
  CalcWeight();

 

 if(m_pChild)
  m_pChild->ApplySkinData();

 

 if(m_pNext)
  m_pNext->ApplySkinData();


}

간단하다 이게 전부다. 루트노드로터 자식, 형제노드를 내려가면서 재귀함수를
호출하는 것이다. 다만 이 노드가 SkinData가 있는 Mesh노드일경우에만 한한다.
이렇게 되면 쓸데없는 BoneNode들도 일단 트리를 타는 단점이 있지만 옛날 코드라
일단 넣어놨다.

CalWeight()라는 함수의 내부를 보자.
지금 이 방식은 Skinning의 세가지 방법. 즉, 소프트웨어적 방식, 메트릭스 팔레트 사용,
정점셰이더 방식 중 소프트웨어적 방식을 사용했다.

 D3DXVECTOR3 vPos;
 D3DXVECTOR3 vTemp;

 for(int i = 0; i < NumSkinData; ++i)    // 해당 Mesh 노드의 Vertex개수와 같은 크기
 {

  vPos = m_pMesh->m_pDumpMesh->m_vecPos[i];
   int NumBlend = m_vecSkinList[i]->NumWVertexs;

  // 영향을 주는 Bone의 개수
  // 개수가 1개라면 가중치는 1.0f 이다.

  for(int k = 0; k < NumBlend; ++k)      
  {
       cFrame* pBone = m_vecSkinList[i]->pBone[k];   
       float  weight = m_vecSkinList[i]->Weight[k];

       if(pBone)
       {
            D3DXVec3TransformCoord(&vTemp, &vPos,  &pBone->m_OffsetTM);  --> 1
            D3DXVec3TransformCoord(&vTemp, &vTemp, &pBone->m_WorldTM); --> 2

            globalPosList[i] += (vTemp * weight);   --> 3

       }
  }
 }

Vertex를 돌면서 각각의 버텍스에 가중치 계산을 해서 결국 최종 버텍스 위치를 구해주면
되는것이다.

1) Vertex를 Bone의 에니메이션되지 않은 Offset위치로 옮겨주는(살을 뼈에 붙인다는 의미로 보면 되겠다) 개념
2) Vertex에 에니메이션 된 최종 WorldTM을 계산해준다. 즉 Bone의 최종 위치로 이동
3) 하지만 가중치만큼을 곱해줘 그 본의 가중치 만큼을 곱해줘 그만큼만 영향을 받게 해준다.
4) 이것을 가중치개수만큼 반복해 누적시켜 최종 Vertex의 위치를 구해준다.

구현 당시 꽤 어려웠던 개념이었던 것에 비해 식이 간단하다. 하지만 이해하지 못하고 쓰는 지식은
죽은 지식이므로 꼭 확실이 이해하고 쓰는게 좋다.

by 넘버원가드 | 2009/05/04 16:23 | 윤선생 캐릭터교실 | 트랙백 | 덧글(1)

트랙백 주소 : http://cswq327.egloos.com/tb/4338966
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by -_- at 2009/05/07 00:54
역시 윤선생 캐릭터교실 ㅋㅋㅋㅋ
설명이 훌륭해요~~~~ㅋㅋ

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶