Assimp:正确旋转加载.blend文件

时间:2017-06-12 07:31:08

标签: coordinates loading blender assimp

我有一个简单的.blend级别,当使用Assimp导入时,它似乎被翻转了:

enter image description here

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));
    }
}

注意我还尝试找到网格所属的节点,并通过该节点的最终转换来转换顶点/法线(最后我的意思是我递归所有节点的父节点和应用他们的变换,最后是节点的局部变换) - 但由于网格没有父节点,所以没有做任何事情。

我的问题是:

  • 加载.blend文件的正确方法是什么?
  • 不应该在导入时自行处理这个问题吗?
  • 还是需要手动旋转/翻转?

以下是引用的模型:https://www.dropbox.com/s/hwsyfyqip5pqhrh/StusRoom.blend?dl=0

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我发现 Blender 希望 .glb 文件按 XZ-Y 轴顺序排列,所以 .blend 文件也许也是如此。

关于 AssImp - 我在我的工作中自己处理这个问题,我发现问题出在 AssImp - 检查链接:https://github.com/assimp/assimp/issues/849(如您所见,这仍然是打开的,即使它现在已经超过 5 岁了)

我相信您需要找出一些解决方法以某种方式手动旋转文件,因为 assimp 会为您旋转它。

希望有帮助!最好的问候