Material과 Texture를 뽑았으니 이제 Mesh Data를 뽑을 차례이다.
Mash에도 이름이 붙기때문에 String으로 name저장을 해주고,
Mesh같은 경우에는 여러개로 나뉘어져 있기 때문에(Mertarial을 여러개 붙여주기 위함)
그래서 Mash 정보에는 materialIndex선언
다음 생성을위한 vertices와 indices 설정해주고
ModelExporter.h로 이동하여 Mesh함수 만들어주기
binary로 받는 것이 좋기 때문에 ReadMesh를 해주는데 node는 트리형태로 뽑아줌
다음 WriteMesh 만들고 vector로 Meshdata 만들고 cpp에 함수 선언하고
cpp로 이동하여 만들어준 함수 작성
Mesh의 갯수만큼 반복
meshdata 생성해주고
mesh에서 node를 통하여 이름을 뽑아주고
원본 data 뽑아주기
memcpy로 데이터 받아 정점 찍어주기, memorycopy
TextureCoords - UV값
Normals - 법선값
TangentsAndBitangents - tangent값
필요한 데이터를 다 뽑아내어
vertices 찍어주기
다음 indices 찍기
NumFaces - 폴리곤 정보, 3개 들어가기떄문에 * 3
폴리곤 갯수 만큼 반복해주고
indices뽑아주고
meshes에 pushback을 해줌
다음 node는 bone) 뼈에 해당되는데 애니메이션을 만들떄 필요한 몸의 뼈대라고 생각하면
된다. 각각의 노드 마다 골반 - 척추 - 머리 이런식으로 상속이 되어 연결되어 뼈를 움직이면
Model이 같이 움직인다. 서로 상속된 node형태로 전부 읽어와야 하기 때문에
재귀 함수를 이용하여 Node탐색을 한다.
다음 테스트를하여 잘 뽑혔는지 호출하여 디버깅
이런 식으로 잘 읽어오는것을 확인할수있다.
다음 모델을 뽑을때 의미없는 데이터들을 줄여준다.
ModelExporter생성자로 이동하여
importer로 (AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS) 쓸모없는
PIVOT을 제거 해준다.
그다음 다시 디버깅하여 잘나오는지 확인한다.
이제 저장을 위해 WriteMesh함수 작성하는데
binary로 저장을하고 캐릭터 이름으로 저장하는데 mesh는 파일을 여러개 할 필요가없어
전부 다 하나로 밀어넣어준다.
다음 CreateFolders불러오고
반복문 이용하여 읽어온 데이터들을 순서대로 저장해주고
디버깅 하여 테스트하여 잘 저장되는지 확인을 해주고
이제 저장한것을 읽어 화면에 모델 출력하기 위해 새로운 ModelRenderScene.h 생성
하고, 다음 cpp 생성하여 model넣어주고
GameManager.cpp에 호출하고,
Model.h 생성
public으로 model생성할 때 필요한 이름과, 소멸자 Render, GUIRender, setShader
받아주고
protected로 멤버변수 만들어줌
name ,materials , meshes, 세개를 통제한 worldBuffer
이제 cpp로 만들어줌 생성자에서 이름 받고 Material과 mesh읽어줄 함수와
worldBuffer
소멸자에서는 material과 mesh들 반복문 통해서 한번에 지우고,
worldBuffer도 delete해주기.
다음 Render에서
worldBuffer 세팅해주고
mesh들 Render
GUI에서 재질 조정할 material Render
가지고 있는 모든 Material Shader 세팅
다음 ReadMaterial로 저장된 model경로를 통해서 읽어오고
BinaryReader에 넣어주고.
조건문 이용하여 경로 잘못됐을시 assert이용하여 멈추기
다음 size에 material의 갯수 넣어주고
반복문 통하여 Material 로드하여 생성하고
push_back으로 넣어주고
다 뻇으면 reader delete
다음 Mesh읽어오기 위의 코드 복사하여 붙여주고 수정
ModelMesh.h도 생성
이름 매개변수로 받고, Vertices랑 indices를 가질거라서 Render함수 받고
CreateMesh Mesh를 생성할 때 필요한 정보들 매개변수로 받기
다음 SetMaterial로 Material 참조
하나의 mesh에는 하나의 material을 가지기 때문에 material, mesh 받기
cpp파일 만들어주고, 소멸자에서 mesh delete해주고
Render에서 material과 mesh 세팅
다음 CreateMesh에서
mesh를 ModelVertex로 만들어주고
Getvertices로 vertexcount 만큼 resize로 미리 공간 잡아주고
memcpy로 이용하여 vertices와 indices정보 넣어줌
필요한 정보를 다 뽑아서 CreateMesh
이제 모든 정보를 다 뽑아 읽어서 생성했고 테스트하면
이런식으로 다운받아온 모델링파일이 월드에 잘 생성이 되는것을 볼 수 있다.
'학원' 카테고리의 다른 글
DirectX 3D LayCollision Box (1) | 2023.11.09 |
---|---|
DirectX 3D Box Collision (3) | 2023.11.09 |
DirectX 3D ExportMaterial (0) | 2023.11.08 |
DirectX 3D SpotLight (0) | 2023.11.08 |
DirectX 3D PointLight (0) | 2023.11.07 |