PyPRT生成 3D场景

你是否曾经梦想过一种高效且简单的方法,只需三行代码即可在 Python 中创建 3D 几何图形?你的梦想成真了,它被称为“PyPRT”。

PyPRT 是CityEngine Procedural Runtime 的 Python 绑定。PRT 代表“Procedural Runtime”,是 CityEngine 3D 生成的核心。不过这篇文章与 CityEngine 无关,你无需了解 CityEngine 即可对以下内容感兴趣。

在可以使用它的所有可能示例中,PyPRT 非常强大,如果你想:

  • 从建筑物足迹(LOD2 建筑物)中生成简单的 3D 内容
  • 优化 3D 几何设计(示例如下)
  • 将 3D 几何图形转换为另一种格式

1、让我们谈谈 Python

2019 年是 Python 年。越来越多的人在他们的项目中使用这种编程语言。根据排名,Python 确实是当今最流行的编程语言之一。

我个人经常使用 Python。实际上,当我 2018 年在苏黎世的 Esri 研发中心开始工作时,我正在研究用于城市规划的机器学习应用程序。作为任何机器学习项目的第一步,我必须处理很多(我的意思是,很多)数据:清理数据、扩展数据、删除异常值、再次处理等等。对于这些任务,Python 很棒!它易于使用、直观且功能强大。我特别喜欢使用Jupyter notebook以及 NumPy 和 Pandas 等库。收集我的数据集后,我使用TensorFlow构建了对我的数据进行建模的神经网络。最后,我可以使用 Matplotlib 绘制结果。Python 具有如此广泛的应用程序,并且对于您正在尝试构建的内容的快速反馈非常方便。

尽管如此,让 Python 用户可以访问 CityEngine PRT API 对我们来说是完全有意义的。请访问PyPRT 页面以获取有关包安装、文档和示例以及即用型规则包和初始形状的更多信息。

2、PRT的 Python 绑定

CityEngine PRT SDK 是在 CityEngine 中执行 3D 生成的底层引擎。简而言之,它允许将任何数据(2D 或 3D)转换为详细的 3D 几何图形。这种变换基于一组几何规则。PRT 是一个 C++ API。因此,PyPRT 的目标是让 Python 用户能够访问 Python 世界中 PRT 的主要功能。

遵循 Python 在简单性和易用性方面的理念,你不需要太多即可使 PyPRT 工作:初始形状和规则文件。例如,初始形状可以是建筑物占地面积、地块或任何多边形。它对应于你要在其上应用程序操作以获得 3D 生成模型的几何图形。将这些过程操作写入规则文件中,该文件是 CGA(计算机生成体系结构)文件。从其名称中可以看出,CGA 文件包含 CGA 代码,它是程序建模语言。如果您想了解有关 CGA 的更多信息,请查看内容。

程序建模:输入几何(左)和生成的 3D 模型(右)

让我们看一个例子。想象一下,你想快速可视化城市社区的建筑物。该区域的建筑物设计在 CGA 规则文件中建模和编码。也许你编写了此规则文件,或者有人将其作为规则包与你共享。此规则包封装了规则文件以及要应用于新建筑物的资源和纹理。

在 Python 脚本或 Jupyter 笔记本中,调用 PyPRT “generate_model”函数。该函数将地块和规则包作为参数,以便按程序计算 3D 几何。然后,你可以将生成的几何图形作为 Python 数组读取并进一步处理。然后,使用 Python 3D 可视化库,可以使用在地块顶部生成的 3D 建筑物对社区进行可视化。

因此,使用 PyPRT,你可以轻松创建存储为 Python 数据结构的 3D 几何图形。但是你也可以将这些生成的几何图形导出为其他格式,如 OBJ、Collada、GLTF、i3s 等。本质上,PyPRT 带有一组几何导出器。

在多个初始形状上程序生成并导出为 OBJ 的 3D 建筑物

最后但同样重要的是,PyPRT 允许在多个初始形状上生成 3D 几何图形。每个初始形状都可以有一个定制的生成模型。例如,在对建筑物进行建模时,可以通过更改 CGA 规则输入属性的值来修改生成的建筑物的参数。使用此功能,整个社区(甚至城市!)的生成大大简化。

3、示例:优化建筑物的绿化面积

在重新开发城市区域时,城市规划师、城市设计师或建筑师必须设计出满足各种要求的最有趣的建筑。其中一些要求是定量的。它们可以是任何东西,从负担得起的公寓数量到建筑物的太阳能潜力。设计满足一组要求的建筑物可能是一项繁琐的任务,尤其是当建筑物的模型很复杂并且由许多可调参数组成时。使用 PyPRT,可以简化建筑设计的优化。

在米兰,你可以参观 Bosco Verticale(垂直森林)建筑。这些建筑被树木和植物所覆盖。在 CityEngine 中,我们编写了一个 CGA 规则文件,允许生成受 Bosco Verticale 立面架构启发的建筑模型。然而,我们可以改变建筑物的三个属性:地块覆盖率、第一层高度和建筑物占地面积形状。给定建筑物的建筑设计(由 CGA 规则定义)和地块,我们应该选择这些属性的哪些值来最大化建筑绿地面积?

优化参数:层高、地块覆盖率、建筑占地面积形状

可以在下面找到解决上述问题所需步骤的简短说明。可以同时查看代码

  1. 使用宗地作为初始形状来实例化 PyPRT ModelGenerator 类。初始形状可以来自文件,也可以指定地块的顶点坐标。在本例中,初始形状是一个 OBJ 文件。
  2. 然后,必须定义优化问题的目标函数。这是我们要最小化或最大化的功能。在其中,调用 ModelGenerator 实例的 PyPRT“generate_model”方法,并将建筑物属性作为参数进行变化。在我们的示例中,优化目标函数的返回值是绿色空间的数量。此编号位于生成模型的报告中。因此,在生成的建筑物上调用“get_report”方法并读取报告字典中的绿色空间条目。
  3. 可以对属性范围指定一些约束(例如最小值和最大值)。
  4. 最后,使用任何优化算法,将目标函数和属性边界作为算法的参数并运行它。它将给出每个属性的最佳值,以最大化绿化面积。

为了解决这个问题,我使用了 Python 社区中广泛使用的SciPy优化库。但是,任何优化算法都适用于 PyPRT。


原文链接:Generating 3D content in Python: PyPRT, a new Python library

BimAnt翻译整理,转载请标明出处