Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 38
>
> filepath = bpy.props.StringProperty(
> name="File Path",
> description="File path used for exporting the simple OBJ file",
> maxlen= 1024, default= "")
> rot90 = bpy.props.BoolProperty(
> name = "Rotate 90 degrees",
> description="Rotate mesh to Y up",
> default = True)
> scale = bpy.props.FloatProperty(
> name = "Scale",
> description="Scale mesh",
> default = 0.1, min = 0.001, max = 1000.0)
> def execute(self, context):
> print("Load", self.properties.filepath)
> from . import simple_obj_export
> simple_obj_export.export_simple_obj(
> self.properties.filepath,
> context.object,
> self.rot90,
> 1.0/self.scale)
> return {'FINISHED'}
> def invoke(self, context, event):
> context.window_manager.fileselect_add(self)
> return {'RUNNING_MODAL'}
>#
># Регистрация
>#
>def menu_func_import(self, context):
> self.layout.operator(IMPORT_OT_simple_obj.bl_idname, text="Simple OBJ (.obj)...")
>def menu_func_export(self, context):
> self.layout.operator(EXPORT_OT_simple_obj.bl_idname, text="Simple OBJ (.obj)...")
>def register():
> bpy.utils.register_module(__name__)
> bpy.types.INFO_MT_file_import.append(menu_func_import)
> bpy.types.INFO_MT_file_export.append(menu_func_export)
>def unregister():
> bpy.utils.unregister_module(__name__)
> bpy.types.INFO_MT_file_import.remove(menu_func_import)
> bpy.types.INFO_MT_file_export.remove(menu_func_export)
>if __name__ == "__main__":
> register()
Симуляции
В этом разделе мы обращаемся к потенциалу симуляций Блендера из Питона. Некоторые из примеров были вдохновлены книгой Bounce, Tumble and Splash Тони Муллена (ищите в Сети великолепный перевод от Morthan'а, пользуясь случаем, передаю ему большое СПАСИБО! - прим. пер.). Однако, большинство рендеров не выглядят так же хорошо, как в книге Муллена, так как целью этих заметок не было найти оптимальный способ для настройки параметров, а скорее чтобы показать, как их можно настраивать из Питона.
Эта программа добавляет две системы частиц.
>#---------------------------------------------------
># File particle.py
>#---------------------------------------------------
>import bpy, mathutils, math
>from mathutils import Vector, Matrix
>from math import pi
>def run(origo):
> # Добавление меша эмиттера
> origin = Vector(origo)
> bpy.ops.mesh.primitive_plane_add(location=origin)
> emitter = bpy.context.object
> # --- Система частиц 1: Падение и сдувание капель ---
> # Добавление первой системы частиц
> bpy.ops.object.particle_system_add()
> psys1 = emitter.particle_systems[-1]
> psys1.name = 'Drops'
> # Эмиссия, испускание
> pset1 = psys1.settings
> pset1.name = 'DropSettings'
> pset1.frame_start = 40
> pset1.frame_end = 200
> pset1.lifetime = 50
> pset1.lifetime_random = 0.4
> pset1.emit_from = 'FACE'
> pset1.use_render_emitter = True
> pset1.object_align_factor = (0,0,1)
> # Физика
> pset1.physics_type = 'NEWTON'
> pset1.mass = 2.5
> pset1.particle_size = 0.3
> pset1.use_multiply_size_mass = True
> # Веса эффекторов
> ew = pset1.effector_weights
> ew.gravity = 1.0
> ew.wind = 1.0
> # Дочерние частицы
> pset1.child_nbr = 10
> pset1.rendered_child_count = 10
> pset1.child_type = 'SIMPLE'
> # Отображение и рендер
> pset1.draw_percentage = 100
> pset1.draw_method = 'CROSS'
> pset1.material = 1
> pset1.particle_size = 0.1
> pset1.render_type = 'HALO'
> pset1.render_step = 3
> # ------------ Эффектор ветра -----
> # Добавление эффектора ветра
> bpy.ops.object.effector_add(
> type='WIND',
> enter_editmode=False,
> location = origin - Vector((0,3,0)),
> rotation = (-pi/2, 0, 0))
> wind = bpy.context.object
> # Настройки полей
> fld = wind.field
> fld.strength = 2.3
> fld.noise = 3.2
> fld.flow = 0.3
> # --- Система частиц 2: Обезьяны на ветру ----
> # Добавление обезьяны, используемой как объект размножения
> # Скрытие обезьяны в слое 2
> layers = 20*[False]