柠檬友玩

首页 > 游戏资讯 > 正文

blender编程教程(blender修改语言)

时间:2022-11-25 21:14:00

在Blender中,“修改器”( Modifier )是动态应用于网格的程序几何体效果,可提供灵活、无损的工作流。 这是用于将新修改器添加到Blender 2.80的编程指南。

3bc1a69c5d71420f95a354882d0a7737~noop.image?_iz=58558&from=article.pc_detail&x-expires=1669986827&x-signature=GTpDIOL2ViZkD%2B%2F00aVVlqToPRo%3D自定义修改器不能用Python描述,因此本指南将说明需要修改Blender代码的哪些部分。

:要修复

1、Blender源码构建

Blender的核心,必须首先通过源代码生成blender。 此流程详细记录在Blender的Wiki: Building Blender中。 假设你遵循了这些关于目录名称的说明。

在实际开始修改代码之前,建议创建一个将更改与上游开发隔离的分支。 例如,让我们叫它pizza-modifier :

//blender-git/blender $ git check out-b pizza-modifier在本文中,我们将添加“pizza”修改器。 我不知道能做什么,但至少我们不会被源代码库中其他出现的“pizza”这个词弄糊涂吧。

2、Pizza修改器概述

那么,需要改变什么? 为什么需要更改这么多文件? 很明显,至少需要对修改器本身的行为进行编码。 但是,您还必须确保它在UI中列出,可以通过Python API访问,并且参数保存在Blender文件中。 最后一点是使用Blender体系结构的核心DNA/RNA机制实现的。

我们的大多数更改都位于/./blender-git/blender/source/blender/modifiers /目录中。

:为

3、Blender核心修改器

blender创建修改器意味着定义ModifierTypeInfo类型的全局变量。 然后,将其注册到全局修改量列表中。 为了使编码样式匹配并更好地适应现有宏,必须将此变量命名为modifierType_Pizza。 其中,“Pizza”是实际修改器名称的首字母大写。

3.1 修改器类型信息

修改器类型信息变量通常位于/./blender-git/blender/source/blender/modifiers/intern文件夹中的MOD_pizza.c文件中

至少,您的MOD_pizza.c文件必须包含以下内容:

# include ' bke _ modifier.h ' modifiertypeinfomodifiertype _ pizza={/* name */' pizza ',/* struct name */' pizzza /* type */eModifierTypeType_None,/* flags */0,/* copy data */none/* deform matrices */null,/* deformvertsssstststttttype /* applyModifier */NULL,/* ining/* requireddatamask */null,/* freeData */NULL,/* isDisabled */NULL,/* ull/* depends on/* dependsonnormals */null,/* foreachObjectLink */NULL,/* foreachtexlink /* foreachTexLink */NULL结构ModifierTypeInfo在source/blender/blen kernel/bke _ modifier.h文件中定义,在我写本文时的第139行字段的意思在这个头文件中已经做了很好的说明,请一定要看看。

集中于一些基本的字段,其他领域留给你探索。 因为,根据你的修改器实现的任务,不一定需要所有这些字段。

3.2 类型和标志

要设置的第一个字段(在名称之后)是修改器类型、类型字段。 因为这是在BKE_modifier.h开头定义的枚举类型,所以再次检查选项以找到最适合修改器的匹配项。 如果不知道,请尝试查看MOD_something.c文件中具有类似行为的现有修改器。

另一个重要字段是flags。 同样是在BKE_modifier.h中定义的枚举。 可能使用eModifierTypeFlag_AcceptsMesh告诉Blender修改器可以处理网格数据。 可以使用逻辑或运算符|设置多个标志。

3.3 应用修改器

修改器的核心是在applyModifier函数中实现的功能。 在定义修改量类型信息变量之前,请定义以下函数:

# include ' DNA _ mesh _ types.h ' static mesh * pizza _ apply modifier ( structmodifierdata * MD,conststructmodifiererevalerevalevald 此功能是修改器进行所有处理的地方。 这完全取决于自己。 返回的网格可以是使用source/blender/blen kernel/bke _ mesh.h函数创建的新网格。 请参见附录中的示例。

3.4 其他字段

某些字段可以使用BKE_modifier.h中定义的工具方法。 例如,可以将copyData设置为modifier_copyData_generic。

4、DNA和RNA

修改类型信息包含两个非常重要的字段:结构名称和结构大小。 它们所指的PizzaModifierData结构成为我们修改器的DNA。

DNA是. blend文件保存在磁盘上的内容。 必须包含所有保存的参数。 根据生物学的比喻,每个DNA都与一个RNA结构相关联。 它仅在运行时使用,用于编辑、传输、撤消和重做与修改器相关的数据。

4.1 DNA

Blender使用的所有DNA结构都在source/blender/makesdna/目录中定义。 在DNA_modifier_types.h文件中定义了该修改器。

首先,将eModifierType_Pizza添加到ModifierType文件的第一个枚举中,并将其放在NUM_MODIFIER_TYPES之前。 枚举值存储在混合文件中,因此无法对其进行重新排序,因为它会破坏向后兼容性。 这也是明确说明列举值的理由。

在文件的末尾,将DNA结构添加到修改器中。 第一个字段必须是类型修改数据。 一种继承机制,允许将指向结构的指针用作更通用的ModifierData*。

typedefstructpizzamodifierdata {修改数据修改器; int num_olives; int _pad0; } PizzaModifierData; 在此示例中,修改器具有整数参数num_olives。

另一个要求是填充结构,使总大小为8字节的倍数。 如果不是自然的,请添加_pad前缀字段,使其为8的倍数。

请注意,在生成Blender之前,整个文件都是通过运行特殊程序makesdna进行处理的,因此不能在此处使用华丽的文件或预处理程序宏。

注意:由于修改器类型信息指向DNA结构,因此必须在MOD_pizza.c文件中包括DNA_modifier_types.h。

4.2 RNA

RNA机制位于source/blender/makesrna/目录中。 与DNA一样,intern中的文件在构建Blender之前由一个名为makesrna的自定义程序处理,因此不需要执行非常重复的DNA/RNA转换任务。

修改器的RNA是在makesrna/intern/rna_modifier.c文件中定义的。 除非用DNA制作高级函数,否则主要制作其他所有现有的简单函数rna_def_modifier_pizza这样的函数,将该函数作为void RNA _ def _ modifier ( blenderr na * Bana )

staticvoidrna _ def _ modifier _ pizza ( blenderr na * brna ) { StructRNA *srna; 属性RNA * prop; //definethernaandbindittothepizzamodifierdatadnastructsrna=RNA _ def _ struct ( brna,' pizzaModifier ',' modifier ) RNA_def_struct_sdna(srna,' PizzaModifierData ' ); RNA_def_struct_ui_icon(srna,ICON_MOD_ARRAY ); //therewillbesuchablockforeachdatafieldofpizzamodifierdataprop=RNA _ def _ property ( srna,' num_olives ',prop ) RNA_def_property_ui_range(prop,0,100,1,-1); RNA_def_property_ui_text(prop,' Olives ',' The number of olives on the pizza ' ); RNA_def_property_update(prop,0,' rna_Modifier_update ' ); }注意( ICON_MOD_ARRAY您可以选择RNA自定义图标,而不是我在此选择的图标。

在RNA_def_modifier ( )的末尾,添加对刚才定义的RNA _ def _ modifier _ pizza ( brna )函数的调用。

:修改了

4.3 修改器类型枚举

修改类型枚举的DNA,因此还必须编辑RNA。 要执行此操作,请在相应的rna_modifier.c部分的开头添加RNA _ enum _ object _ modifier _ type _ items条目。 节标题是{0,',0,N_('Modify ' ),' }类型的行。 它们与添加新修改器时在UI中显示的下拉菜单直接相关。 第二个参数是用于呈现UI的Python函数的名称。 请参阅以下内容。

还必须编辑在/* Default */之前添加的rna_Modifier_refine函数。

caseemodifiertype _ pizza:return RNA _ pizza modifier; 注:变量RNA_PizzaModifier不需要自己定义。 由makesrna生成。

这样就完成了DNA/RNA相关的更改。 对修改器参数可能有更高级的需求。 在这种情况下,请自由查看其他修改器如何处理特殊情况。 这些都是在同一个文件中定义的。

注意:有关RNA的详细信息,请参阅此归档文件。

5、用户界面

修改器的用户界面是在Python脚本中定义的。 release/scripts/startup/bl _ ui/properties _ data _ modifier.py。

将绘制方法defpizza(self,layout,ob,md ) :添加到DATA_PT_modifiers类与其他修改器已经存在的功能类似。 函数的名称必须与上面RNA _ enum _ object _ modifier _ type _ items ( RNA _ modifier.c )中定义的条目匹配。 例如:

# inclassdata _ pt _ modifiersdefpizza ( self,layout,ob,md ):layout.prop(MD,' num_olives ' )注意:在生成时,此porid

6、最后的步骤

我们的修改器具有通过DNA存储在Blender文件中并通过RNA传输的内核,但是需要在其他位置注册。

6.1 修改器表

修改器的类型信息必须位于全局修改器表中。 这是通过在modifier_type_init原型之前的source/blender/modifiers/mod _ modifier types.h的末尾添加以下行来完成的:

externmodifiertypeinfomodifiertype _ pizza; 在source/blender/modifiers/intern/mod _ util.c中,在#undef INIT_TYPE之前:

init_type(pizza;

6.2 大纲

大纲是UI空间,可以列出有关当前打开的Blender文件的所有技术详细信息。 因此,您必须知道所有修饰符,包括新的Pizza修饰符。 在source/blender/editors/space _ outliner/outliner _ draw.c中编辑tree_element_get_icon函数,以编辑相应的casemodifierter

7、结论

当前,您的修改器具有第一个骨架。 接下来,通过阅读BKE_modifier.h的注释和其他修饰符的实现可以学到很多东西。

原文链接: http://www.bi mant.com/blog/custom-blender-modifier /