fbx 로딩하고 나면 자체적으로 매쉬데이터로 전환하고 파일에 저장을 시킨다.
그래서 동일한 이름의 meshdata를 로딩한다.
한번이라도 로딩하면 meshdata 폴더에 그 이름의 .mdat 이 저장이 되고 그걸 로딩한다.
.mdat는 자기가 무슨 메쉬를 참조하였고, 어떤 재질을 참조하고 있었는지(키값 저장), 그 재질 안에서 어떤 텍스쳐를 참조했는지 저장되어있다.
mesh 함수에 가면 mesh 파일을 저장할 수 있는 save 함수를 구현해놨음.
그래서 두번째부터는 loadfbx가 아니라 findres 하면 된다.
meshdata로 저장해두었으면, fbx파일이 필요없다 이미 저장이 되어 있기 때문에..
애니메이션이 어떻게 돌아가는지?
정점만 저장하는게 아니라 클립이라고해서 애니메이션 클립정보가 저장되어있다.
클립정보 1개가 애니메이션 하나라고 생각하면된다.
뼈정보.. 구조체
struct.h -> FbxTime::EMode eMode;
해당 클립이 초당 몇프레임짜리 모드로 돌아가는지 enum 값이 저장되어 있다.
ex) eFrames30 -> 초당 30프레임
----
부모가 바뀌면 이동하는 꼴. . .
취하고 싶은 포즈가 1434개 프레임이 있는데 거기서 1200번대 프레임에 있다면..각 뼈가 1200번대 프레임으로 셋팅을 해야한다.
뼈(정점)는 개념적으로만 존재하는거고 그 겉에 살이 붙어서(매쉬) 그 스킨이 모양을 취해야 하는 것이다.
std3d_deferred.fx -> VS_OUT VS_Std3D_Deferred(VS_IN _in) 에
if (g_iAnim)
{
Skinning(_in.vPos, _in.vTangent, _in.vBinormal, _in.vNormal, _in.vWeights, _in.vIndices, 0);
}
이걸 넣어줘야 애니메이션이 동작함..
이걸 주석걸면 애니메이션이 전혀 적용되지 않은 기본 상태인 순수한 정점위치들이 나오게 된다.
이제는 정점 안에 weight랑 indice 정보가 있어야한다
indice 는 정수로 딱 떨어지게 저장이 된다.
ex)
weight 0.7 0.3 0 0
indice 14 111 0 0
이라고 하면, 14번 뼈에 가중치 70% 111번 뼈에 30% 가중치를 가지고 있다는 의미이다.
만약 1200번대 포즈를 취하고 싶으면 1200번대의 프레임의 14번 뼈의 최종 행렬정보 111번 뼈의 최종 행렬정보를 7:3 의 비율로 섞으면 그게 그 정점의 위치정보가 된다는 뜻이다.
35분
Skinning에 들어가면..
원래 로컬포즈에 해당행렬정보(matBone)를 곱해서 가중치를 곱해서 누적한다. => 최종 위치
스키닝 작업을 해서 로컬 상태의 값을 바꾸는 것이다.
애니메이션이 진행되면 방향벡터도 다 바뀐다.
애니메이션을 진행하는 애는 객체이다..
같은 매쉬를 참조할 수도 있고 아무튼 .. 여러개이다
얘네마다 애니메이션이 다 다르게 진행될 수 있다.
animator 컴포넌트에서는 구조화버퍼로 특정 프레임 한 줄어치 만큼의 구조화버퍼를 들고있따.
컴퓨터쉐이더는 본인의 프레임대에 맞는 정보를 복사해서 넣어둔다.
이걸 t30 에 PS_VERTEX로 보내놓는다!
컴퓨터쉐이더에서 쿼터니언..? 으로 행렬을 만든다.. 수학적이고.. 어렵다~~ 그냥 이런게 있다 정도만 알면된다.
// 구조화버퍼에 결과값 저장
g_arrFinelMat[_iThreadIdx.x] = mul(matOffset, matBone);
matOffset은 다시 원점으로? 돌려놓는 것..
최종적으로 원점으로 돌려놓고 이동하려는 행렬을 곱해야 이동이 가능..!
현재 그림자에 스키닝 적용이 안되어 있음.. 직접 해야함
러프를 활용하면 부드러운 애니메이션을 구현할 수 있다.
실제 애니메이션은 시간대별로 애니메이션이 다르다..
걷기, 공격,, 등등
그래서 몇 번 클립에서 몇 초에서 몇 초 사이인지 정보가 있어야한다.
'DirectX 11 3d' 카테고리의 다른 글
230626 FBX 정적 매쉬 로딩 (0) | 2023.07.13 |
---|---|
230621 Directional Light Shadow (0) | 2023.07.13 |
230619 Mapmapping (0) | 2023.06.26 |
230615 LandScape - Splating(색칠) (0) | 2023.06.26 |
230609 LandScape Heightmap (0) | 2023.06.25 |