Bone, Mesh 데이터 가져오기
Convert.cpp - RoadModelData()
- 모든 노드를 순회하면서 각 노드 하나하나를 Bone로 저장
- 각 노드의
transform이 Parent기준인 상대좌표이기에, Root기준인 로컬 좌표로 변환
RoadMeshData()를 불러주고, 재귀를 통해서 모든 노드 순회
void Converter::ReadModelData(aiNode* node, int32 index, int32 parent)
{
shared_ptr<asBone> bone = make_shared<asBone>();
bone->index = index;
bone->parent = parent;
bone->name = node->mName.C_Str();
Matrix transform(node->mTransformation[0]);
bone->transform = transform.Transpose();
Matrix matParent = Matrix::Identity;
if (parent >= 0)
matParent = _bones[parent]->transform;
bone->transform = bone->transform * matParent;
_bones.push_back(bone);
ReadMeshData(node, index);
for (uint32 i = 0; i < node->mNumChildren; i++)
ReadModelData(node->mChildren[i], _bones.size(), index);
}
Converter.cpp - RoadMeshData()
- 메쉬의 경우 서브메쉬로 나눠져 있는 경우가 있기에, 서브메쉬로 나누지말고 하나의 메쉬로 관리하는 방식으로 진행
void Converter::ReadMeshData(aiNode* node, int32 bone)
{
if (node->mNumMeshes < 1)
return;
shared_ptr<asMesh> mesh = make_shared<asMesh>();
mesh->name = node->mName.C_Str();
mesh->boneIndex = bone;
for (uint32 i = 0; i < node->mNumMeshes; i++)
{
uint32 index = node->mMeshes[i];
const aiMesh* srcMesh = _scene->mMeshes[index];
const aiMaterial* material = _scene->mMaterials[srcMesh->mMaterialIndex];
mesh->materialName = material->GetName().C_Str();
const uint32 startVertex = mesh->vertices.size();
for (uint32 v = 0; v < srcMesh->mNumVertices; v++)
{
VertexType vertex;
::memcpy(&vertex.position, &srcMesh->mVertices[v], sizeof(Vec3));
if (srcMesh->HasTextureCoords(0))
::memcpy(&vertex.uv, &srcMesh->mTextureCoords[0][v], sizeof(Vec2));
if (srcMesh->HasNormals())
::memcpy(&vertex.normal, &srcMesh->mNormals[v], sizeof(Vec3));
mesh->vertices.push_back(vertex);
}
for (uint32 f = 0; f < srcMesh->mNumFaces; f++)
{
aiFace& face = srcMesh->mFaces[f];
for (uint32 k = 0; k < face.mNumIndices; k++)
mesh->indices.push_back(face.mIndices[k] + startVertex);
}
}
_meshes.push_back(mesh);
}
참고 강의
https://www.inflearn.com/courses/lecture?courseId=329791&type=LECTURE&unitId=161140&tab=curriculum&subtitleLanguage=ko