Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² написаниС скриптов Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ для Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° 2.5x. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 20

Автор Thomas Larsson

    if 'simple_obj_export' in locals():

        imp.reload(simple_obj_export)  


import bpy

from bpy.props import *

from io_utils import ExportHelper, ImportHelper  


#

# МСню Import

class IMPORT_OT_simple_obj(bpy.types.Operator, ImportHelper):

    bl_idname = "io_import_scene.simple_obj"

    bl_description = 'Import from simple OBJ file format (.obj)'

    bl_label = "Import simple OBJ" bl_space_type = "PROPERTIES"

    bl_region_type = "WINDOW"


    filename_ext = ".obj"

    filter_glob = StringProperty(default="*.obj;*.mtl", options={'HIDDEN'})


    filepath = bpy.props.StringProperty(

        name="File Path",

        description="File path used for importing the simple OBJ file",

        maxlen= 1024, default= "")


    rot90 = bpy.props.BoolProperty(

        name = "Rotate 90 degrees",

        description="Rotate mesh to Z 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):

        from . import simple_obj_import

        print("Load", self.properties.filepath)

        simple_obj_import.import_simple_obj(

            self.properties.filepath,

            self.rot90,

            self.scale)

        return {'FINISHED'}  


    def invoke(self, context, event):

        context.window_manager.fileselect_add(self)

        return {'RUNNING_MODAL'}  


#

# МСню Export


class EXPORT_OT_simple_obj(bpy.types.Operator, ExportHelper):

    bl_idname = "io_export_scene.simple_obj"

    bl_description = 'Export from simple OBJ file format (.obj)'

    bl_label = "Export simple OBJ"

    bl_space_type = "PROPERTIES"

    bl_region_type = "WINDOW" 


    # Из ExportHelper. Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ².

    filename_ext = ".obj"

    filter_glob = StringProperty(default="*.obj", options={'HIDDEN'})


    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]

    layers[1] = True

    bpy.ops.mesh.primitive_monkey_add(

         location=origin+Vector((0,5,0)),

         rotation = (pi/2, 0, 0),

         layers = layers)

    monkey = bpy.context.object  


    #Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ систСмы частиц

    bpy.context.scene.objects.active = emitter

    bpy.ops.object.particle_system_add()

    psys2 = emitter.particle_systems[-1]

    psys2.name = 'Monkeys'

    pset2 = psys2.settings

    pset2.name = 'MonkeySettings'  


    # Эмиссия, испусканиС

    pset2.count = 4

    pset2.frame_start = 1

    pset2.frame_end = 50

    pset2.lifetime = 250

    pset2.emit_from = 'FACE'

    pset2.use_render_emitter = True  


    # Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ

    pset2.factor_random = 0.5  


    # Π€ΠΈΠ·ΠΈΠΊΠ°

    pset2.physics_type = 'NEWTON'

    pset2.brownian_factor = 0.5  


    # ВСса эффСкторов

    ew = pset2.effector_weights

    ew.gravity = 0

    ew.wind = 0.2 


    # Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ частицы

    pset2.child_nbr = 1

    pset2.rendered_child_count = 1

    pset2.child_size = 3

    pset2.child_type = 'SIMPLE'  


    # ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€

    pset2.draw_percentage = 1

    pset2.draw_method = 'RENDER'

    pset2.dupli_object = monkey

    pset2.material = 1

    pset2.particle_size = 0.1

    pset2.render_type = 'OBJECT'

    pset2.render_step = 3


    return 


if __name__ == "__main__":

    bpy.ops.object.select_by_type(type='MESH')

    bpy.ops.object.delete()

    run((0,0,0))

    bpy.ops.screen.animation_play(reverse=False, sync=False)


Волосы

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° добавляСт сфСру с волосами. Для волос строится ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ Ρ‚ΠΈΠΏΠ° strand.



#---------------------------------------------------

# File hair.py

#---------------------------------------------------

import bpy 


def createHead(origin):

# Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ мСша эмиттСра

bpy.ops.mesh.primitive_ico_sphere_add(location=origin)

 ob = bpy.context.object

 bpy.ops.object.shade_smooth()  


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ scalp (скальп), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ вСсов