Меши

Меш

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



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

# File meshes.py 

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

import bpy


def createMesh(name, origin, verts, edges, faces):

  # Создание меша и объекта

   me = bpy.data.meshes.new(name+'Mesh')

   ob = bpy.data.objects.new(name, me)

   ob.location = origin

   ob.show_name = True

   # Привязка объекта к сцене

   bpy.context.scene.objects.link(ob)


   # Создание меша из передаваемых списков вершин, рёбер, граней.

# Или рёбра или грани должны быть [], иначе Вам нужны проблемы

   me.from_pydata(verts, edges, faces)


   # Обновляет меш с новыми данными

   me.update(calc_edges=True)

   return ob 


def run(origin):

   (x,y,z) = (0.707107, 0.258819, 0.965926)

   verts1 = ((x,x,-1), (x,-x,-1), (-x,-x,-1), (-x,x,-1), (0,0,1))

   faces1 = ((1,0,4), (4,2,1), (4,3,2), (4,0,3), (0,1,2,3))

   ob1 = createMesh('Solid', origin, verts1, [], faces1)

   verts2 = ((x,x,0), (y,-z,0), (-z,y,0))

   edges2 = ((1,0), (1,2), (2,0))

   ob2 = createMesh('Edgy', origin, verts2, edges2, [])


   # Сдвигает второй объект с дороги

   ob1.select = False

   ob2.select = True

   bpy.ops.transform.translate(value=(0,2,0)) 


return if __name__ == "__main__":

   run((0,0,0))


Группы вершин и ключи формы

Эта программа добавляет UV-сферу с двумя группами вершин (Left И Right) и четырьмя ключами формы.



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

# File shapekey.py

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

import bpy, random


def run(origin):

   # Добавление UV-сферы

   bpy.ops.mesh.primitive_uv_sphere_add(

     segments=6, ring_count=5, size=1, location=origin)

   ob = bpy.context.object

   ob.name = 'ShapeKeyObject'

   ob.show_name = True


   # Создаёт левую (Left) и правую (Right) группы вершин

   left = ob.vertex_groups.new('Left')

   right = ob.vertex_groups.new('Right')

   for v in ob.data.vertices:

      if v.co[0] > 0.001:

       left.add([v.index], 1.0, 'REPLACE')

     elif v.co[0] < -0.001:

       right.add([v.index], 1.0, 'REPLACE')

      else:

        left.add([v.index], 0.5, 'REPLACE')

       right.add([v.index], 0.5, 'REPLACE')


   # Добавление ключа Basis (базовый)

   bpy.ops.object.shape_key_add(None)

   basis = ob.active_shape_key


   # Добавление ключа FrontForward:

   # передние вершины сдвигаются на единицу вперёд

   # Пределы изменения (Slider) от -1.0 до +2.0

   bpy.ops.object.shape_key_add(None)

   frontFwd = ob.active_shape_key

   frontFwd.name = 'FrontForward'

   frontFwd.slider_min = -1.0 frontFwd.slider_max = 2.0

   for v in [19, 20, 23, 24]:

     pt = frontFwd.data[v].co

     pt[1] = pt[1] - 1


   # Добавление ключей TopUp: верхние вершины перемещаются на единицу вверх.

   # TopUp_L и TopUp_R влияют только на левые и правые половины, соответственно

   keylist = [(None, ''), ('Left', '_L'), ('Right', '_R')]

   for (vgrp, suffix) in keylist:

     bpy.ops.object.shape_key_add(None)

     topUp = ob.active_shape_key

     topUp.name = 'TopUp' + suffix

     if vgrp:

       topUp.vertex_group = vgrp

     for v in [0, 1, 9, 10, 17, 18, 25]:

       pt = topUp.data[v].co

        pt[2] = pt[2] + 1


   # Установка позы ключам формы

   for shape in ob.data.shape_keys.key_blocks:

     shape.value = random.random()

   return 


if __name__ == "__main__":

   # Создание пяти объектов с произвольными ключами формы

   for j in range(5):

     run((3*j,0,0))


Применение модификатора массива (array)

Эта программа создает цепь из десяти звеньев. Звено является простым тором, масштабированным вдоль оси x. Мы добавляем звену модификатор массива, где смещение управляется пустышкой (empty). Наконец, модификатор массива применяется (apply), создавая из цепи единственный меш.



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

# File chain.py

# Creates an array modifier and applies it# Update to API rev. 36523

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

import bpy

import math

from math import pi


def run(origin):

# Добавление единственного звена цепи к сцене

   bpy.ops.mesh.primitive_torus_add(

     #major_radius=1,

     #minor_radius=0.25,

     major_segments=12,

     minor_segments=8,

     use_abso=True,

    abso_major_rad=1,

     abso_minor_rad=0.6,

     location=(0,0,0),

     rotation=(0,0,0))


   # Масштабирование тора вдоль оси x

   ob = bpy.context.object

   ob.scale = (0.7, 1, 1)

   bpy.ops.object.transform_apply(scale=True)


   # Создание пустышки

   bpy.ops.object.add(

     type='EMPTY',

     location=(0,1.2,0.2),

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

   empty = bpy.context.object


   # Звено цепи снова делается активным

   scn = bpy.context.scene

   scn.objects.active = ob


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

   mod = ob.modifiers.new('Chain', 'ARRAY')

   mod.fit_type = 'FIXED_COUNT'

   mod.count = 10

   mod.use_relative_offset = 0

   mod.use_object_offset = True

   mod.offset_object = empty


   # Применение модификатора

   bpy.ops.object.visual_transform_apply()

   bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Chain')


   # Перемещение цепи на место

   bpy.ops.transform.translate(value=origin)


   # Пустышка больше не нужна

   scn.objects.unlink(empty)

   del(empty)


   return


if __name__ == "__main__":

   run((0,3,0))


Загрузка...