【问题标题】:Use LoadModelFromMemoy in ASSIMP to load obj model with no texture loaded在 ASSIMP 中使用 LoadModelFromMemoy 加载未加载纹理的对象模型
【发布时间】:2022-12-14 22:31:54
【问题描述】:

我目前正在开发一个 Android 项目,我需要在 Android 平台上使用 ASSIMP 加载 .obj 文件。我的实现方式是先使用 AssetManager 将 .obj 文件加载到内存中,然后使用 importer.ReadFileFromMemory() 函数创建 aiScene 对象。我已经设法导入了所有顶点数据,但我发现纹理丢失了。我实际上是从 ASSIMP GitHub 页面上读到的,其中提到 ReadFileFromMemory() 不会跨文件读取内容,因此我认为它没有读取应用纹理的 .mtl 文件。我想使用 importer.ReadFile() 函数,但我不知道如何在 Android 平台上使用它。有人有建议吗?

附件是我对 loadModelFromMemory 的实现,类似于 LearnOpenGL 的 loadModel


void Model::loadModelFromMemory(const void* pbuffer, size_t pLength)
{
    Log::Message("Enter loadModelFromMemory", LOG_INIT);

    // read file via ASSIMP
    Assimp::Importer importer;

    const aiScene* scene = importer.ReadFileFromMemory(pbuffer, pLength, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

    // check for errors
    if(!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) // if is Not Zero
    {
        Log::Message(strcat("ERROR::ASSIMP::", importer.GetErrorString()), LOG_ERROR);
        return;
    }
    // process ASSIMP's root node recursively
    processNode(scene->mRootNode, scene);
}

我试过使用ReadFile,但它不适用于 Android 上下文。我还尝试使用 ASSIMP 提供的 MemoryIOWrapper,但不知道从哪里开始。

【问题讨论】:

    标签: android android-ndk assimp .obj gles


    【解决方案1】:

    有多种方法可以实现这一点。

    1. 通过内存缓冲区加载 mtl 和 obj 文件
    2. 使用 android 文件系统实现从您手机上的资产文件夹加载资产。您可以在Android File system implementations找到我们的标题

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 2017-09-27
      • 2013-12-27
      • 1970-01-01
      • 2012-01-13
      • 2021-10-23
      • 2023-01-30
      • 2018-05-11
      • 2019-11-02
      相关资源
      最近更新 更多