当前位置: 首页 > 知识库问答 >
问题:

从文件的内容创建AIScene实例

贝自怡
2023-03-14

我正在编写一个Java Web服务,可以在其中上传3D对象,对其进行操作并存储它。

我试图做的是创建一个<code>AIScene作为输入参数,即文件本身(它的内容)。

我在文档中找不到这样做的方法,所有导入方法都需要路径。

现在,我要看一下Assimp的lwjgljava版本和C版本。用哪一个来解决这个问题并不重要。

编辑:我试图完成的代码:

@Override
public String uploadFile(MultipartFile file) {
    AIFileIO fileIo = AIFileIO.create();
    AIFileOpenProcI fileOpenProc = new AIFileOpenProc() {
        public long invoke(long pFileIO, long fileName, long openMode) {
            AIFile aiFile = AIFile.create();
            final ByteBuffer data;

            try {
                data = ByteBuffer.wrap(file.getBytes());
            } catch (IOException e) {
                throw new RuntimeException();
            }

            AIFileReadProcI fileReadProc = new AIFileReadProc() {
                public long invoke(long pFile, long pBuffer, long size, long count) {
                    long max = Math.min(data.remaining(), size * count);
                    memCopy(memAddress(data) + data.position(), pBuffer, max);
                    return max;
                }
            };
            AIFileSeekI fileSeekProc = new AIFileSeek() {
                public int invoke(long pFile, long offset, int origin) {
                    if (origin == Assimp.aiOrigin_CUR) {
                        data.position(data.position() + (int) offset);
                    } else if (origin == Assimp.aiOrigin_SET) {
                        data.position((int) offset);
                    } else if (origin == Assimp.aiOrigin_END) {
                        data.position(data.limit() + (int) offset);
                    }
                    return 0;
                }
            };
            AIFileTellProcI fileTellProc = new AIFileTellProc() {
                public long invoke(long pFile) {
                    return data.limit();
                }
            };
            aiFile.ReadProc(fileReadProc);
            aiFile.SeekProc(fileSeekProc);
            aiFile.FileSizeProc(fileTellProc);
            return aiFile.address();
        }
    };
    AIFileCloseProcI fileCloseProc = new AIFileCloseProc() {
        public void invoke(long pFileIO, long pFile) {
            /* Nothing to do */
        }
    };
    fileIo.set(fileOpenProc, fileCloseProc, NULL);
    AIScene scene = aiImportFileEx(file.getName(),
            aiProcess_JoinIdenticalVertices | aiProcess_Triangulate, fileIo); // ISSUE HERE. file.getName() is not a path, just a name. so is getOriginalName() in my case. 

    try{
        Long id = scene.mMeshes().get(0);
        AIMesh mesh = AIMesh.create(id);
        AIVector3D vertex = mesh.mVertices().get(0);

        return mesh.mName().toString() + ": " + (vertex.x() + " " + vertex.y() + " " + vertex.z());
    }catch(Exception e){
        e.printStackTrace();
    }
    return "fail";
}

调试方法时,我在绑定到本机的方法中发现了访问冲突:

public static long naiImportFileEx(long pFile, int pFlags, long pFS)

这是信息:

#

#

#

#

#

#

#

共有1个答案

苏培
2023-03-14

这是可能的,如果我们使用aiMatryFileFromMemory方法。

我想遵循的方法是从github演示中复制的,实际上不必要地复制了缓冲区。

访问冲突的原因是使用了间接缓冲区(要了解为什么这是一个问题,请查看此处)。

解决方案远没有我最初粘贴的代码复杂:

@Override
    public String uploadFile(MultipartFile file) throws IOException {
        ByteBuffer buffer = BufferUtils.createByteBuffer((int) file.getSize());
        buffer.put(file.getBytes());
        buffer.flip();
        AIScene scene = Assimp.aiImportFileFromMemory(buffer,aiProcess_Triangulate, (ByteBuffer) null);
        Long id = scene.mMeshes().get(0);
        AIMesh mesh = AIMesh.create(id);
        AIVector3D vertex = mesh.mVertices().get(0);
        return mesh.mName().dataString() + ": " + (vertex.x() + " " + vertex.y() + " " + vertex.z());
    }

在这里,我创建了一个具有适当大小的直接缓冲区,加载数据并翻转它(这一部分是必须的)。之后,让Assimp发挥它的魔力,这样就可以获得指向结构的指针。使用<code>return<code>语句,我只检查是否获得了有效数据。

编辑

正如在评论中指出的那样,此实现仅限于单个文件上传,并假设它从那个MultipartFile中获取所需的所有内容,它无法很好地处理引用的格式。有关更多详细信息,请参阅文档。

在问题注释中链接的演示在问题中用作基础,其用例与我的原始用例不同。

 类似资料:
  • 本文向大家介绍Python创建文件和追加文件内容实例,包括了Python创建文件和追加文件内容实例的使用技巧和注意事项,需要的朋友参考一下 一、用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行: 二、文件内容追加,从0到9的10个随机整数: 三、文件内容追加,从0到9的随机整数, 10个数字一行,共10行: 四、把标准输出定向到文件: 例子: 查看22端口情况,并将结果写入a.

  • 问题内容: 我已经在下面使用过一段时间了。至少在我访问过的网站上,它似乎是分布最广的。 在Java中,是否有更好/不同的方式将文件读取为字符串? 问题答案: 读取文件中的所有文本 Java 11添加了方法来读取小文件,以String保留行终止符: 对于介于Java 7和11之间的版本,这是一个紧凑而健壮的习惯用法,它包装在实用程序方法中: 从文件中读取文本行 Java 7添加了一种便捷方法,可以将

  • 本文向大家介绍Java创建文件且写入内容的方法,包括了Java创建文件且写入内容的方法的使用技巧和注意事项,需要的朋友参考一下 前两天在项目中因为要通过http请求获取一个比较大的json数据(300KB左右)并且保存,思来想去,最后还是决定将获取到的json数据以文件的形式保存下来,每次使用的时候去读取文件就可以了。 废话不多说了,直接上代码。 以下是代码截图,文章结尾会有完成的代码文件可供下载

  • 假设我想从许多xmls中编写具有以下格式的文本输出。其中一些xml文件可能没有节点[name、age、schood]的值。 <学生> 因此,基本上我使用的是iu正在使用的一个xsl文件,并试图通过考虑这些类似格式的xml文件(具有不同的节点值)来生成输出。 但是我只需要将相应的输出写到具有特定条件的xml文件中。[假设有一个名称,因为有些xml文件不包含名称值]。 因此,如果我有5个xml文件要转

  • 我有一个可执行JAR,其中有一个文件,我想从代码中打开java.io.文件实例(不是InputStream或其他任何东西...只是文件)。 它是一个maven项目,文件位于“src/main/resources/file.xxx”的根目录下。打包后,该文件位于jar的根目录下(已验证其存在)。 我的第一次尝试:FileNotFoundException 其他尝试:FileNotFoundExcep

  • 是否有可能从内存中(而不是磁盘上)的文件创建ZipArchive。 以下是用例:多个文件在