我有一个简单的.blend级别,当使用Assimp导入时,它似乎被翻转了:
Blender使用Z作为其向量,我的引擎使用Y. Blender中没有导出/保存选项允许我在.blend中设置
Afaik Assimp应该为我处理这个问题。以下是我如何加载模型,将其转换为我的引擎的运行时格式:
// vertices, normals and uvs
{
u32 VertexCount = SrcMesh->mNumVertices;
u32 ByteCount = VertexCount * sizeof(f32) * 3;
DstMesh->VerticesCount = VertexCount;
DstMesh->Vertices = new vec[VertexCount];
memcpy(DstMesh->Vertices, SrcMesh->mVertices, ByteCount);
FAIL_IF_NOT(SrcMesh->mNormals, "Model doesn't have normals");
DstMesh->Normals = new vec[VertexCount];
memcpy(DstMesh->Normals, SrcMesh->mNormals, ByteCount);
FAIL_IF_NOT(SrcMesh->mTextureCoords[0], "Model doesn't have UVs");
DstMesh->UVs = new vec[VertexCount];
memcpy(DstMesh->UVs, SrcMesh->mTextureCoords[0], ByteCount);
}
// faces
{
DstMesh->FacesCount = SrcMesh->mNumFaces;
DstMesh->Faces = new mesh_face[DstMesh->FacesCount];
For(i32, F, DstMesh->FacesCount)
{
aiFace *SrcFace = &SrcMesh->mFaces[F];
mesh_face *DstFace = &DstMesh->Faces[F];
FAIL_IF_NOT(SrcFace->mNumIndices == 3, "Model is not triangulated. Face index %d has %d indices", F, SrcFace->mNumIndices);
memcpy(DstFace->Indices, SrcFace->mIndices, 3 * sizeof(u32));
}
}
注意我还尝试找到网格所属的节点,并通过该节点的最终转换来转换顶点/法线(最后我的意思是我递归所有节点的父节点和应用他们的变换,最后是节点的局部变换) - 但由于网格没有父节点,所以没有做任何事情。
我的问题是:
以下是引用的模型:https://www.dropbox.com/s/hwsyfyqip5pqhrh/StusRoom.blend?dl=0
感谢您的帮助!
答案 0 :(得分:0)
我发现 Blender 希望 .glb 文件按 XZ-Y 轴顺序排列,所以 .blend 文件也许也是如此。
关于 AssImp - 我在我的工作中自己处理这个问题,我发现问题出在 AssImp - 检查链接:https://github.com/assimp/assimp/issues/849(如您所见,这仍然是打开的,即使它现在已经超过 5 岁了)
我相信您需要找出一些解决方法以某种方式手动旋转文件,因为 assimp 会为您旋转它。
希望有帮助!最好的问候