`
Читать книги » Книги » Компьютеры и Интернет » Программирование » Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

1 ... 19 20 21 22 23 ... 27 ВПЕРЕД
Перейти на страницу:

    scalp = ob.vertex_groups.new('Scalp')

    for v in ob.data.vertices:

        z = v.co[2]

        y = v.co[1]

        if z > 0.3 or y > 0.3:

             w = 2*(z-0.3)

             if w > 1:

                 w = 1

             scalp.add([v.index], w, 'REPLACE')

    return ob 

def createMaterials(ob):

    # Некоторый материал для кожи

    skinmat = bpy.data.materials.new('Skin')

    skinmat.diffuse_color = (0.6,0.3,0)  

    # Материал strand для волос

    hairmat = bpy.data.materials.new('Strand')

    hairmat.diffuse_color = (0.2,0.04,0.0)

    hairmat.specular_intensity = 0  

    # Прозрачность

    hairmat.use_transparency = True

    hairmat.transparency_method = 'Z_TRANSPARENCY'

    hairmat.alpha = 0 

    # Strand. Нужно включить use Blender units перед заданием размеров.

    strand = hairmat.strand

    strand.use_blender_units = True

    strand.root_size = 0.01

    strand.tip_size = 0.0025

    strand.size_min = 0.001

    #strand.use_surface_diffuse = True # read-only

    strand.use_tangent_shading = True  

    # Текстура

    tex = bpy.data.textures.new('Blend', type = 'BLEND')

    tex.progression = 'LINEAR'

    tex.use_flip_axis = 'HORIZONTAL'  

    # Создание цветовой полосы для цвета и альфа-канала

    tex.use_color_ramp = True

    tex.color_ramp.interpolation = 'B_SPLINE'

    # Точки на цветовой полосе: (pos, rgba)

    # Не знаю, как добавлять точки на полосу

    rampTable = [

        (0.0, (0.23,0.07,0.03,0.75)),

        #(0.2, (0.4,0.4,0,0.5)),

        #(0.7, (0.6,0.6,0,0.5)),

        (1.0, (0.4,0.3,0.05,0))

    ]

    elts = tex.color_ramp.elements

    n = 0

    for (pos, rgba) in rampTable:

        elts[n].position = pos

        elts[n].color = rgba

        n += 1 

    # Добавление текстуры blend к hairmat

    mtex = hairmat.texture_slots.add()

    mtex.texture = tex

    mtex.texture_coords = 'STRAND'

    mtex.use_map_color_diffuse = True

    mtex.use_map_alpha = True  

    # Добавление материала к мешу

    ob.data.materials.append(skinmat) # Material 1 = Skin

    ob.data.materials.append(hairmat) # Material 2 = Strand

    return  

def createHair(ob):

    # Создание системы частиц hair

    bpy.ops.object.particle_system_add()

    psys = ob.particle_systems.active

    psys.name = 'Hair'

    # psys.global_hair = True

    psys.vertex_group_density = 'Scalp'

    pset = psys.settings

    pset.type = 'HAIR'

    pset.name = 'HairSettings'  

    # Эмиссия

    pset.count = 40

    pset.hair_step = 7

    pset.emit_from = 'FACE' 

    # Рендер

    pset.material = 2

    pset.use_render_emitter = True

    pset.render_type = 'PATH'

    pset.use_strand_primitive = True

    pset.use_hair_bspline = True  

    # Дочерние частицы

    pset.child_type = 'SIMPLE'

    pset.child_nbr = 10

    pset.rendered_child_count = 500

    pset.child_length = 1.0

    pset.child_length_threshold = 0.0

    pset.child_roundness = 0.4

    pset.clump_factor = 0.862

    pset.clump_shape = 0.999

    pset.roughness_endpoint = 0.0

    pset.roughness_end_shape = 1.0

    pset.roughness_1 = 0.0

    pset.roughness_1_size = 1.0

    pset.roughness_2 = 0.0

    pset.roughness_2_size = 1.0

    pset.roughness_2_threshold = 0.0

    pset.kink = 'CURL'

    pset.kink_amplitude = 0.2

    pset.kink_shape = 0.0

    pset.kink_frequency = 2.0

    return 

def run(origin):

    ob = createHead(origin)

    createMaterials(ob)

    createHair(ob) return 

if __name__ == "__main__":

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

    bpy.ops.object.delete()

    run((0,0,0))

Редактируемые волосы

Эта программа добавляет сферу с редактируемыми волосами от полученных направляющих (guides) волос. Если мы переключаемся в режим редактирования, все пряди становятся прямыми, то есть результат редактирования теряется. Это можно предотвратить, если вы переключитесь в режим частиц, выберите объект, и переключитесь обратно в режим объекта. К сожалению, я не нашел способа сделать это с помощью скрипта.

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

# File edit_hair.py

# Имеет недостатки, но может быть интересна в любом случае.

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

import bpy 

def createHead():

    # Добавление меша эмиттера

    bpy.ops.mesh.primitive_ico_sphere_add()

    ob = bpy.context.object

    ob.name = 'EditedHair'

    bpy.ops.object.shade_smooth()

    return ob 

def createHair(ob, guides):

    nGuides = len(guides)

    nSteps = len(guides[0])  

    # Создание системы частиц hair

    bpy.ops.object.mode_set(mode='OBJECT')

    bpy.ops.object.particle_system_add()

    psys = ob.particle_systems.active

    psys.name = 'Hair' 

    # Настройки частиц

    pset = psys.settings

    pset.type = 'HAIR'

    pset.name = 'HairSettings'

    pset.count = nGuides

    pset.hair_step = nSteps-1

    pset.emit_from = 'FACE'

    pset.use_render_emitter = True  

    # Дочерние частицы

    pset.child_type = 'SIMPLE'

    pset.child_nbr = 6

    pset.rendered_child_count = 300

    pset.child_length = 1.0

    pset.child_length_threshold = 0.0  

    # Отсоединение волос и переключение в режим редактирования частиц

    bpy.ops.particle.disconnect_hair(all=True)

    bpy.ops.particle.particle_edit_toggle()  

    # Настройка всех ключевых волос

    dt = 100.0/(nSteps-1)

    dw = 1.0/(nSteps-1)

    for m in range(nGuides):

       guide = guides[m]

       part = psys.particles[m]

       part.location = guide[0]

       for n in range(1, nSteps):

           point = guide[n]

           h = part.hair_keys[n-1]

           h.co_hair_space = point

           h.time = n*dt

           h.weight = 1.0 - n*dw  

    # Переключение режима редактирования частиц

    bpy.ops.particle.select_all(action='SELECT')

    bpy.ops.particle.particle_edit_toggle()  

    # Подсоединение волос к мешу

    # Во время рендера случится Segmentation violation, если эта строка отсутствует.

    bpy.ops.particle.connect_hair(all=True)  

    # К сожалению, здесь шаг действий вручную представляется необходимым:

    # 1. Переключиться в режим частиц

    # 2. Прикоснуться к объекту с кистью

    # 3. Переключиться в режим объектов

    # 4. Переключиться в режим редактирования

    # 5. Переключиться в режим объектов

    # Это должно соответствовать коду ниже, но терпит неудачу из-за

    # неверного контекста

    '''

    bpy.ops.particle.particle_edit_toggle()

    bpy.ops.particle.brush_edit()

    bpy.ops.particle.particle_edit_toggle()

    bpy.ops.object.editmode_toggle()

    bpy.ops.object.editmode_toggle()

    '''

    return 

# Направляющие волос. Четыре волоса с пятью точками.

hairGuides = [

    [(-0.334596,0.863821,0.368362),

     (-0.351643,2.33203,-0.24479),

     (0.0811583,2.76695,-0.758137),

     (0.244019,2.73683,-1.5408),

     (0.199297,2.60424,-2.32847)],

    [(0.646501,0.361173,0.662151),

     (1.33538,-0.15509,1.17099),

     (2.07275,0.296789,0.668891),

     (2.55172,0.767097,-0.0723231),

     (2.75942,1.5089,-0.709962)],

    [(-0.892345,-0.0182112,0.438324),

     (-1.5723,0.484807,0.971839),

     (-2.2393,0.116525,0.324168),

     (-2.18426,-0.00867975,-0.666435),

     (-1.99681,-0.0600535,-1.64737)],

    [(-0.0154996,0.0387489,0.995887),

     (-0.205679,-0.528201,1.79738),

     (-0.191354,0.36126,2.25417),

     (0.0876127,1.1781,1.74925),

     (0.300626,1.48545,0.821801)] ] 

def run(origin):

    ob = createHead()

    createHair(ob, hairGuides)

    ob.location = origin

    return  

if __name__ == "__main__":

    run((0,0,0))

Ткань

Эта программа добавляет плоскость с модификатором ткани. У плоскости есть родитель — обруч, который движется вниз, где она встречается с препятствием-сферой. Влияние модификатора ткани находится под контролем группы вершин, а это значит, что углы движутся с обручем, в то время как середина деформируется препятствием. Плоскости присваивается материал со стресс-отображением прозрачности.

1 ... 19 20 21 22 23 ... 27 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода, относящееся к жанру Программирование. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)