我正在开发一个用 Java 编写的小型 3D 引擎。Java 主要用于可移植性(桌面和安卓)和可用库。Blender 提供了用于设计关卡的工具。
我希望使用相同的 java 库来导出和加载自定义数据。
如何混合 Blender、Python 和 Java?
我想到了BlenderJava和 Jython,但这是非常实验性的。
谢谢
PS:有人已经在 Blender中使用了 execnet吗?
我正在开发一个用 Java 编写的小型 3D 引擎。Java 主要用于可移植性(桌面和安卓)和可用库。Blender 提供了用于设计关卡的工具。
我希望使用相同的 java 库来导出和加载自定义数据。
如何混合 Blender、Python 和 Java?
我想到了BlenderJava和 Jython,但这是非常实验性的。
谢谢
PS:有人已经在 Blender中使用了 execnet吗?
搅拌机 + Java:
好吧,如果您正在谈论创建场景然后加载 .blend 文件,那不是一个好方法。您可能希望将关卡/角色/等导出为其他内容。我以前使用过 openGL 和 java。我建议导出为 collada(.dae 文件)。Collada 文件是基于 xml 的(易于使用 DOM 或 SAX 解析),并且不携带任何 gl 无论如何都无法使用的额外搅拌机数据。Collada 文件支持动画帧、骨骼结构、光源、材质、纹理、颜色、法线和顶点。同样,由于它们是基于 XML 的文件,因此很容易使用文本编辑器打开它们并研究文件类型。由于 java 的库中已经有 XML 解析器,因此这种文件类型易于使用和阅读。它的数据几乎可以立即转储到 BufferObject 或立即渲染模式中。
Fbx 是另一种支持搅拌机所有元素的文件类型。这种类型的问题在于它同时具有二进制和文本格式。结构略有不同,因此很难找到描述二进制文件格式的资源。同样,它是一种受版权保护的文件类型。
Obj 文件是最容易阅读和使用的。但是,它们将纹理/材质数据存储在单独的外部文件中。同样,它们绝不支持动画。因此,出于多种原因,它们是一个糟糕的选择。但是,如果您有一个静态对象(一个盒子或一棵无生命的树),则此文件类型可能适合您。
正如我之前提到的,如果没有双方易于读取的文件类型,很难直接混合 blender 和 java,.blend 文件不容易被 java 读取。
Java + Python:
这有点棘手。我认为 Jython 是一个很好的起点。Python 可以与脚本类似地使用,至少在与引擎一起使用时是这样。您选择如何实施它完全取决于您。
就个人而言,我发现使用预制的 java 命令创建游戏控制台更容易。我有简单的文本文件,可以调用控制台的命令来编写脚本。脚本可以定义诸如人工智能运动和资源加载之类的东西。
我很难找到将类似脚本的引擎(您可能会在 python 中编写的代码)合并到游戏引擎中的一组强有力的理由。我承认这不是我经常合作的引擎开发领域。无论哪种方式,我都觉得它只会调用您的 java 类的命令(或方法)。也许有人可以为我们俩澄清一下python在游戏引擎中的更强用途。
最后,我会推荐 javaScript 而不是 python。使用 Python 是因为它很受欢迎,而且大多数引擎都是用 C++ 或 C# 编码的。与 java 不同,这些语言没有脚本“小弟”。如果您打算使其成为真正的 Java 引擎,那么使用 JS 作为您选择的脚本语言会容易得多,因为使用它的库已经与 JDK 打包在一起。
希望这会有所帮助。
那么,我得到的是你想要构建和读取你自己的文件类型?也许是基于 XML 的?将您自己的库合并到搅拌机中的唯一方法是通过 python。我知道人们已经为 blender(包括动画导出器)构建了 python 扩展和插件。
人们通常只使用他们自己的文件类型和他们自己的工具(例如,如果您创建了一个像搅拌机这样的程序)。因为,假设有人喜欢使用不同的 3D 建模软件,他们将无法使用您的引擎。理想情况下,工具和渲染引擎的功能彼此独立。Blender 已经可以导出几种提供更大灵活性的标准文件类型。
我不会创建一个库来导出自定义文件类型,除非您也制作了自定义工具。它只会鼓励其他人使用不同的引擎,而不是你的。
顺便说一句,这个问题属于 stackexchange 而不是 stackoverflow。