使用 Assimp 在 Unity 中加载 3D 模型

问题描述 投票:0回答:1

是否可以使用 Assimp 在 Unity 中加载 3D 模型? 当我使用 Assimp 搜索代码示例时,我只找到使用 Virtual Studio 的 C++ 示例。 我可以使用 AssimpNET 版本 3.0(c# 包装器)和 c# 代码加载 3D 模型,但我的目标是使用 Assimp64.dll 而不是 AssimpNET.dll。

谢谢:)

unity-game-engine assimp
1个回答
0
投票

可以在运行时在 Unity 中加载 3D 模型,并通过 Unity 的插件系统使用 Assimp C++ 版本,但为此,您必须使用本机 Assimp 插件创建自己的中间通信层。它应该能够将数据(例如从 Unity 到 Assimp dll 的字符串路径)发送,并且还应该能够编组 Assimp 加载的模型数据 -

aiScene
aiNode
aiMesh
aiMaterial
类来命名一些采用类格式,可供 Unity 的 Mesh 和 Material C# 脚本 API 使用。
这不是一件容易的任务,特别是如果您的目标是生产级的抛光输出,而且并非
aiMaterial
类中的所有内容都可以使用 Unity 的材质关键字映射到一对一的基础上。

熟悉 C# 如何通过非托管代码编组和处理数据是完成这项工作的必要条件:

继续进行的一些指示是:

  • 建立代码以将字符串数据(主要是模型路径)发送到本机插件,在其中它将被映射到
    char*
    以供 Assimp 使用。
  • 当你得到
    aiScene*
    输出时,这是Assimp在解析模型文件后给出的数据,你将必须建立一个能够生成整个模型节点树(节点的层次树或场景树)的系统)从 C# 端的
    aiScene*
    输出中存在的根节点开始,然后根据层次结构在 Unity 中生成游戏对象。
  • Assimp 将返回一组
    aiMesh
    aiMaterial
    。 Assimp 的每个
    aiNode
    对象都包含对该节点所具有的网格的引用,并且每个网格都指向一个材质索引,即
    aiMaterial
    数组的索引。使用这些信息,它基本上是一种树遍历,您需要为每个节点找到正确的数据,将 Unity 中的正确组件添加到特定节点游戏对象,然后根据存在的数据设置组件值。

由于除了 trilib 之外,没有行业级的免费/开源解决方案来实现此目的,因此我们为我们的项目制作了自己的框架来执行此操作。我们使用 learnopengl.com 的模型加载部分作为参考来了解 Assimp 的工作原理、我们要使用的数据,并使用

System.Runtime.InteropServices
功能使其与 Unity 配合使用。从产品信息中可以看到,甚至可以播放动画。但由于 Assimp 和 Unity 功能的差异,这种安排存在一些限制。由于项目开发的范围很大,我只提到了可以开始构建的前 3 个要点,而不是完整深入地探讨我们如何让它适用于该产品的所有细节。

© www.soinside.com 2019 - 2024. All rights reserved.