Blender的python脚本编写模式

Python脚本模式提供了完整的可编程行样式。在这种控制模式下,所有的样式化操作都被编写为Python脚本,在Freestyle术语中称为样式模块。样式模块的输入是视图地图(即一组检测到的特征边),输出是一组样式化笔划。

样式模块由五个基本操作符的连续调用组成:选择、链接、拆分、排序和笔划创建。选择操作符基于一个或多个用户定义的选择条件(谓词)识别输入特征边的子集。所选边通过链式、分裂式和排序操作符进行处理,以构建特征边链。这些操作符也由用户提供的谓词和函数控制,以确定如何将特征边转换为链。最后,笔划创建操作符将链转换为样式化笔划,该操作符获取用户定义的笔划着色器列表。

Python样式的模块作为文本数据块存储在混合文件中。外部样式模块文件首先需要加载到文本编辑器中。然后,样式模块堆栈条目中的选择菜单允许您从加载的样式模块列表中选择模块。

freestyleforblender附带了许多Python样式的模块,可以作为您自己编写样式模块的起点。另请参阅blenderpythonapi参考手册中的freestylepythonapi部分,以获取样式模块构造的完整细节。

 

写作风格模块

样式模块是一段代码,负责*式线条绘制的样式化。样式模块的输入是一组称为视图地图(ViewMap)的特征边。输出是一组样式化的线,也称为笔划。样式模块被构造为一个操作管道,允许从视图地图中的输入边构建笔划。

有五种操作(列出了相应的运算符函数):

选择运算符。select()

Chaining Operators.chain(),Operators.bidirectional\u chain()

spliting Operators.sequential\u split(),Operators.recursive\u split()

排序运算符。sort()

笔划创建操作符.create()

输入视图地图由一组ViewEdge对象填充。选择操作用于根据用户定义的选择条件(谓词)拾取艺术家感兴趣的ViewEdge。链接操作获取ViewEdges的子集,并根据用户定义的谓词和函数连接ViewEdges来构建链。可以通过将链拆分为更小的片段(例如,在边缘发生急转弯的点处)并选择其中的一部分(例如,仅保留长度超过阈值的片段)来进一步细化链。排序操作用于排列链的堆叠顺序,以便在另一条线上画一条线。通过笔划创建操作将一系列笔划明暗器应用于单个链,最终将链转化为样式化笔划。

视图边、链和笔划通常称为一维(1D)元素。一维元素是由一系列相连的直线组成的多段线。1D元素的顶点通常称为0D元素。

所有操作符作用于一组活动的一维元素。初始活动集是输入视图地图中的视图边集。活动集由运算符更新。

选择

选择运算符遍历活动集的每个元素,只保留满足某个谓词的元素。Operators.select()方法将一元谓词作为参数,该谓词适用于表示1D元素的任何Interface1D。例如:

运算符。选择(QuantitativeInvisibilityUP1D(0))

此选择操作使用QuantitativeInvisibilityUP1D谓词仅选择可见的ViewEdge(更准确地说,是那些quantitativeinvisibility等于0的ViewEdge)。选择操作符旨在有选择地将样式应用于部分活动1D元素。

注意,QuantitativeInvisibilityUP1D是一个实现测试行可见性的谓词的类,Operators.select()方法将谓词类的一个实例作为参数。对给定1D元素的谓词的测试实际上是通过调用谓词实例来完成的,也就是说,通过调用predicate类的\uu call \uuu方法来完成的。换句话说,Operators.select()方法以函子作为参数,函子又以Interface0D对象作为参数。*风格pythonapi广泛地使用functor来实现谓词和函数。

链形

“链接”操作符作用于活动ViewEdge对象集,并确定未来笔划的拓扑。其思想是实现一个迭代器,通过沿着ViewEdge行进来遍历ViewMap图形。迭代器定义了一个链规则,用于确定给定顶点处要遵循的下一个ViewEdge(请参见ViewEdgeIterator)。一些这样的迭代器是作为freestylepythonapi的一部分提供的(请参见ChainPredicateIterator和chainScreetIterator)。自定义迭代器可以通过继承ViewEdgeIterator类来定义。chaining操作符还将在Interface1D上工作的一元谓词作为参数作为停止条件。当迭代器在沿着图前进的过程中到达满足此谓词的ViewEdge时,链接停止。

链接可以是单向运算符.chain()或双向运算符.bidirectional\u chain()。在后一种情况下,链将从起始边沿两个方向传播。

以下是双向链接的代码示例:

操作员.u链(

迭代器(),

NotUP1D(定量不可见性up1d(0)),

)

“链接”操作符使用“链剪影迭代器”作为链接规则,并在迭代器到达不可见的ViewEdge时立即停止链接。

“链接”操作符按顺序处理活动ViewEdge对象集。以前可以使用Operators.sort()方法对活动ViewEdge进行排序(请参见下文)。它以活动集的第一个ViewEdge开始一个链。所有已经参与链接过程的ViewEdge都会被标记(在上述示例中,默认情况下,每个ViewEdge的时间戳都会被修改),以便不会对同一ViewEdge进行两次处理。一旦链到达满足停止谓词的ViewEdge,链就终止了。然后从活动集中第一个未标记的ViewEdge开始一个新链。重复此操作,直到处理活动集的最后一个未标记的ViewEdge。在链接操作结束时,活动集被设置为刚刚构建的链。

排序

sorting操作符Operators.sort()排列活动1D元素的堆叠顺序。它以一个用作“小于”运算符的二进制谓词作为参数,对两个1D元素进行排序。

Operators.sort(Length2DBP1D())

在这个代码示例中,排序使用Length2DBP1D二进制谓词按2D长度的升序对Interface1D对象进行排序。

当与因果密度相结合时,排序特别有用。事实上,因果密度评估结果图像的密度,因为它是修改。如果我们希望在局部密度过高时使用这样的工具来决定删除笔划,那么控制笔划的绘制顺序是很重要的。在这种情况下,我们将使用排序运算符来确保首先绘制最“重要”的线。

笔划创建

最后,stroke creation操作符Operators.create()将活动链集作为输入并构建笔划。运算符接受两个参数。第一个是一元谓词,作用于Interface1D,用于在链集上进行最后的选择。不满足条件的链条不会导致冲程。第二个输入是着色器列表,这些着色器将负责每个构建笔划的着色。

着色器列表=[

采样阴影(5.0),

恒定厚度着色器(2),

常量颜色着色器(0.2,0.2,0.2,1),

]

Operators.create(DensityUP1D(8,0.1,IntegrationType.MEAN),shaders\u list)

在本例中,DensityUP1D谓词用于删除平均密度高于0.1的所有链。通过对每个链重新采样,使其每5个单位有一个点,并为其指定2个单位的恒定厚度和一个深灰色恒定颜色,将每个链转换为一个笔划。

用户对管道定义的控制

样式模块编写提供了不同类型的用户控件,即使单个样式模块具有固定的管道结构。一种是对不同的管道控制结构进行排序,另一种是通过定义函子对象,函子对象作为参数沿管道传递。

可以通过排序选择、链接、拆分和排序操作来定义不同的管道控制结构。笔划创建始终是结束样式模块的最后一个操作。

谓词、函数、链接迭代器和笔划着色器可以通过继承基类和重写适当的方法来定义。有关用户可编写脚本的构造的更多信息,请参阅以下基类的参考手册条目。

原文链接:https://docs.blender.org/manual/zh-hans/dev/render/freestyle/python.html?highlight=python

上一篇:Redis 的 3 种集群方案对比,写得非常好!


下一篇:Google地图3D城市模型下载最新实践