Blender 之修改器代码分析                      Blender 之修改器代码分析

 

  Blender的修改器(modifier)模块,默认界面右下块(Property)面板的扳手,分类(修改、生成、形变、模拟)列出所有的修改器。也可以空格键输入modifier,出现"Add Modifier"后点击即可。我参与翻译了官方的修改器文档,也跟着制作双螺旋结构的DNA教程走了一遍,算是对修改器有个大致的了解。制作很简单,用上细分表面(Subsurf)、镜像(Mirror)、阵列(Array)、曲线(Curve)四个修改器。首先添加杆与球,用上细分表面修改器,得到更圆滑的效果。接着用镜像修改器得到一个碱基对,成哑铃状。然后用阵列修改器,生成梯子形状。最后用曲线修改器,扭转前面的梯子得到DNA的模型。如果对修改器不熟悉,可以照着教程走一遍,会有收获的。

  修改器作为Blender的一个子系统,设计成栈模式。前一个修改器的输出作为后一个修改器的输入,达到最终的效果。修改器是一种以非破坏性(non constructive)的方式影响物体的操作。修改器可以添加或删除,栈上移上移下,应用会让更改生效(编辑模式下不可应用)。

  修改器的工程 bf_modifiers.vcxproj ,源码路径在 source/blender/modifiers/ ,相关文件有:
source/blender/blenkernel/BKE_modifier.h
source/blender/blenkernel/intern/modifier.c

source/blender/editors/object/object_intern.h
source/blender/editors/object/object_modifier.c

source/blender/makesdna/DNA_modifier_types.h
source/blender/makesdna/intern/rna_modifier.c


Operator

  把鼠标停在Array修改器上,会给出提示(tooltip):
Add a modifier to the active object: Array
Python: bpy.ops.object.modifier_add(type="ARRAY")
  第一句是Operator 的 description 字段,第二句是对应的 Python 代码。直接在源码里工程搜索字符串 "Add a modifier" 就会指引你去往有关修改器的Operator

  字符串在 OBJECT_OT_modifier_add 函数里,找到 OBJECT_OT_modifier_add 函数名后,Visual Studio 里按下F12(或鼠标右键选择Go To definition)跳转到定义处。
  从 object_intern.h 找到有关修改器 add / remove / move_up / move_down / apply / convert / copy 的 Operator:
void OBJECT_OT_modifier_add(struct wmOperatorType *ot);
void OBJECT_OT_modifier_remove(struct wmOperatorType *ot);
void OBJECT_OT_modifier_move_up(struct wmOperatorType *ot);
void OBJECT_OT_modifier_move_down(struct wmOperatorType *ot);
void OBJECT_OT_modifier_apply(struct wmOperatorType *ot);
void OBJECT_OT_modifier_convert(struct wmOperatorType *ot);
void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);

 

void OBJECT_OT_modifier_add(wmOperatorType *ot)
{
    PropertyRNA *prop;

    /* identifiers */
    ot->name = "Add Modifier";
    ot->description = "Add a modifier to the active object";
    ot->idname = "OBJECT_OT_modifier_add";
    
    /* api callbacks */
    ot->invoke = WM_menu_invoke;
    ot->exec = modifier_add_exec;
    ot->poll = ED_operator_object_active_editable;
    
    /* flags */
    ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
    
    /* properties */
    prop = RNA_def_enum(ot->srna, "type", rna_enum_object_modifier_type_items, eModifierType_Subsurf, "Type", "");
    RNA_def_enum_funcs(prop, modifier_add_itemf);
    ot->prop = prop;
}
OBJECT_OT_modifier_add

相关文章:

  • 2021-10-22
  • 2021-08-20
  • 2022-03-06
  • 2022-12-23
  • 2021-08-12
  • 2021-07-10
  • 2022-12-23
  • 2022-02-16
猜你喜欢
  • 2022-02-12
  • 2021-11-18
  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2021-10-29
  • 2022-12-23
相关资源
相似解决方案