GLVisualize 是一个交互式可视化库,支持 2D 和 3D 渲染以及基本 GUI 的构建。它完全使用 Julia 和 OpenGL 编写。我非常高兴能够在 Julia Summer of Code 的支持下继续参与这个项目。
在 **JSoC** 期间,我的主要重点是改进 GLVisualize,但也改进了一些周边基础设施,例如 GeometryTypes、FileIO、ImageMagick、MeshIO 和 FixedSizeArrays。这篇博文中记录的所有 GIF 都存在有损压缩。您可以点击其中大部分 GIF 查看生成它们的代码。
**GLVisualize** 最有趣的部分之一是,它将 GUI 和可视化结合在一起,而不是依赖于像 **QT** 这样的第三方库来创建 GUI。这样做有很多优点和缺点。主要优点是,交互式可视化与 GUI 库共享许多基础设施。通过将这两者结合起来,可以实现一些新的功能,例如在 3D 空间中编辑文本标签,或者使可视化元素像按钮一样工作。这些功能应该会非常流畅,因为 **GLVisualize** 是为了追求高性能而创建的。
显然,最大的缺点是,它很难达到例如 **QT** 那样的成熟度和功能完整性。
因此,要真正获得两全其美,需要做很多工作。
令人惊讶的是,我花费了大量时间与 Tim Holy 一起改进 **FileIO**。**FileIO** 的卖点是,您可以将文件加载到 **FileIO** 中,它会识别格式并加载相应的 IO 库。这使得在 Julia 中开始处理文件变得容易得多,因为不需要事先了解 Julia 中的格式和文件加载知识。这对于可视化库来说非常完美,因为大多数可视化都始于以某种格式存在的数据,这些数据最初甚至可能是未知的。
由于所有文件都使用相同的函数加载,因此实现像拖放任何 FileIO 支持的文件这样的功能变得容易得多。举个例子,由于 FileIO 的存在,**GLVisualize** 中拖放功能的实现只需要 几行代码
我一直在做的另一个功能是改进 2D 支持。我实现了不同的抗锯齿标记、文本渲染和线型。除了图像标记外,它们都使用 距离场技术 来实现与视图无关的抗锯齿。以下是一些示例
在最后一个示例中,所有标记都一起移动。这实际上是 **GLVisualize** 的核心功能之一。标记在 GPU 上共享相同的内存来存储位置,没有任何开销。然后,每个标记只需具有到该共享位置的不同偏移量即可。这在 **GLVisualize** 中很容易实现,因为所有可视化方法都定义在 GPU 对象上。这也适用于来自在 GPU 上计算的一些仿真的 GPU 对象。
在 **JSoC** 期间,我还为 GLVisualize 实现了滑块和线条编辑小部件。您可以使用它们为可视化的参数添加交互性
我还与 David P. Sanders 合作,将其 台球模型 可视化,该模型演示了粒子系统和一种新的相机类型。
粒子系统可以使用任何网格基元。为了方便加载和创建网格,Steve Kelly 和我重写了 Meshes 包,以包含更多功能并更好地分离网格 IO 和操作。IO 现在位于 **MeshIO** 中,它支持 **FileIO** 接口。网格类型位于 **GeometryTypes** 中,网格算法位于 JuliaGeometry 组织中的不同包中。
在这个例子中,您可以看到,还有一些 GUI 小部件可以与相机进行交互。角落的小矩形用于在正交投影和透视投影之间切换。可以使用立方体将相机中心对准特定侧面。这种类型的小部件在 **GLVisualize** 中很容易实现,因为它从一开始就是为 GUI 和交互性而构建的。更好的相机控制是一个很大的可用性优势,我将投入更多时间来进一步改进这些控制。
我录制了最后一个演示,以向您提供更多关于 **GLVisualize** 目前能够做什么的想法
演示展示了不同类型的动画、3D 文本编辑和弹出窗口,所有这些都相对容易包含在使用 **GLVisualize** 创建的任何可视化中。
所有这些看起来都很有希望,但仍然需要做很多工作!首先,**GLVisualize** 仍然没有带标签的版本,可以通过 Julia 的包管理器直接安装。这是因为 Reactive.jl 和 Images.jl 目前没有标记为与 **GLVisualize** 兼容的版本。
另一方面,API 还没有经过充分的思考。计划使用 Escher.jl 和 Compose.jl 中的更多想法来改进 API。目标是在某个时刻完全支持 Compose 接口。这样,**GLVisualize** 可以用作 Gadfly 的后端。这将使 **Gadfly** 更加适合大型动画数据集。在接下来的几周里,我需要编写教程、文档并更好地处理边缘情况。
非常感谢 Julia 团队和所有参与其中的人,使这一切成为可能!