Чтение онлайн

ЖАНРЫ

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

Larsson Thomas

Шрифт:

Эта программа добавляет конус с модификатором softbody (мягкое тело) и плоскость-препятствие.

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

# File softbody.py

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

import bpy

import mathutils

from mathutils import Vector

def run(origin):

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

red = bpy.data.materials.new('Red')

red.diffuse_color = (1,0,0)

blue = bpy.data.materials.new('Blue')

blue.diffuse_color = (0,0,1)

# Добавление конуса

bpy.ops.mesh.primitive_cone_add(

vertices=4,

radius=1.5,

cap_end=True)

ob1 = bpy.context.object

me1 = ob1.data

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

bpy.ops.mesh.subdivide(number_cuts=5, smoothness=1, fractal=1)

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

# Странно, нужен новый меш, который является копией

verts = []

faces = []

for v in me1.vertices:

verts.append(v.co)

for f in me1.faces:

faces.append(f.vertices)

me2 = bpy.data.meshes.new('Drop')

me2.from_pydata(verts, [], faces)

me2.update(calc_edges=True)

# Установка гладкости граням (smooth)

for f in me2.faces: f.use_smooth = True

# Добавление нового объекта и его активация

ob2 = bpy.data.objects.new('Drop', me2)

scn = bpy.context.scene

scn.objects.link(ob2)

scn.objects.unlink(ob1)

scn.objects.active = ob2

# Добавление групп вершин

top = ob2.vertex_groups.new('Top')

bottom = ob2.vertex_groups.new('Bottom')

for v in me2.vertices:

w = v.co[2] - 0.2

if w < 0:

if w < -1:

w = -1

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

elif w > 0:

if w > 1:

w = 1

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

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

ob2.location = origin

me2.materials.append(blue)

#
Добавление модификатора softbody

mod = ob2.modifiers.new(name='SoftBody', type='SOFT_BODY')

sbset = mod.settings

# Мягкое тело

sbset.friction = 0.6

sbset.speed = 0.4

sbset.mass = 8.1

# Цель

sbset.goal_default = 0.7

sbset.goal_spring = 0.3

sbset.goal_friction = 0.0

sbset.vertex_group_goal = 'Top'

# Края мягкого тела

sbset.pull = 0.6

sbset.push = 0.1

sbset.bend = 0.1

sbset.aerodynamics_type = 'LIFT_FORCE
'

sbset.aero = 0.5

# Добавление вихря

bpy.ops.object.effector_add(

type='VORTEX',

location=origin+Vector((0,0,-4)))

vortex = bpy.context.object

fset = vortex.field

fset.strength = 4.5

fset.shape = 'PLANE'

fset.apply_to_location = False

fset.apply_to_rotation = True

fset.falloff_type = 'TUBE'

# Добавление плоскости столкновения

# Предупреждение. Столкновение объектов делает симуляцию очень медленной!

bpy.ops.mesh.primitive_plane_add(

location=origin-Vector((0,0,1.7)))

bpy.ops.transform.resize(value=(4, 4, 4))

plane = bpy.context.object

plane.data.materials.append(red)

mod
 = plane.modifiers.new(name='Collision', type='COLLISION')

return

if __name__ == "__main__":

bpy.context.scene.frame_end = 600

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

bpy.ops.object.delete

run(Vector((0,0,6)))

bpy.ops.screen.animation_play

#bpy.ops.render.opengl(animation=True)

Ткань, мягкие тела и текстуры displace
Поделиться с друзьями: