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))
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ΅ΠΏΡ ΠΈΠ· Π΄Π΅ΡΡΡΠΈ Π·Π²Π΅Π½ΡΠ΅Π². ΠΠ²Π΅Π½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΡΠΌ ΡΠΎΡΠΎΠΌ, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π²Π΄ΠΎΠ»Ρ ΠΎΡΠΈ 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))
ΠΡΠΌΠ°ΡΡΡΡ
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°ΡΡ Π°ΡΠΌΠ°ΡΡΡΡ.
#---------------------------------------------------
# File armature.py
#---------------------------------------------------
import bpy, math
from mathutils import Vector, Matrix
def createRig(name, origin, boneTable):
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°ΡΠΌΠ°ΡΡΡΡ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
bpy.ops.object.add(
type='ARMATURE',
enter_editmode=True,
location=origin)
ob = bpy.context.object
ob.show_x_ray = True
ob.name = name
amt = ob.data
amt.name = name+'Amt'
amt.show_axes = True
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡΡΠ΅ΠΉ
bpy.ops.object.mode_set(mode='EDIT')
for (bname, pname, vector) in boneTable:
bone = amt.edit_bones.new(bname)
if pname:
parent = amt.edit_bones[pname]
bone.parent = parent
bone.head = parent.tail
bone.use_connect = False
(trans, rot, scale) = parent.matrix.decompose()
else:
bone.head = (0,0,0)
rot = Matrix.Translation((0,0,0)) # ΠΠ°ΡΡΠΈΡΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΠΈ
bone.tail = Vector(vector) * rot + bone.head
bpy.ops.object.mode_set(mode='OBJECT')
return ob
def poseRig(ob, poseTable):
bpy.context.scene.objects.active = ob
bpy.ops.object.mode_set(mode='POSE')
deg2rad = 2*math.pi/360
for (bname, axis, angle) in poseTable:
pbone = ob.pose.bones[bname]
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΠΆΠΈΠΌΠ° Π²ΡΠ°ΡΠ΅Π½ΠΈΡ Π² Euler XYZ (ΠΠΉΠ»Π΅ΡΠΎΠ²ΠΎ),
# Π»Π΅Π³ΡΠ΅ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, ΡΠ΅ΠΌ ΠΊΠ²Π°ΡΠ΅ΡΠ½ΠΈΠΎΠ½Ρ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
pbone.rotation_mode = 'XYZ'
# ΠΠΎΡΡΠΊ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ: Euler.rotate(angle,axis):
# ΠΎΡΠΈ Π² ['x','y','z'] Π° Π½Π΅ ['X','Y','Z']
pbone.rotation_euler.rotate_axis(axis, angle*deg2rad)
bpy.ops.object.mode_set(mode='OBJECT')
return
def run(origo):
origin = Vector(origo)
# Π’Π°Π±Π»ΠΈΡΠ° ΠΊΠΎΡΡΠ΅ΠΉ Π² ΡΠΎΡΠΌΠ΅ (ΠΊΠΎΡΡΡ, ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π²Π΅ΠΊΡΠΎΡ)
# ΠΠ΅ΠΊΡΠΎΡ Π΄Π°Π½ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°Ρ
boneTable1 = [
('Base', None, (1,0,0)),
('Mid', 'Base', (1,0,0)),
('Tip', 'Mid', (0,0,1))
]
bent = createRig('Bent', origin, boneTable1)
# ΠΡΠΎΡΠ°Ρ ΠΎΡΠ½Π°ΡΡΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΠΌΠΎΠΉ Π»ΠΈΠ½ΠΈΠ΅ΠΉ, ΡΠΎ Π΅ΡΡΡ ΠΊΠΎΡΡΠΈ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ Π²Π΄ΠΎΠ»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠΈ Y
boneTable2 = [
('Base', None, (1,0,0)),
('Mid', 'Base', (0,0.5,0)),
('Mid2', 'Mid', (0,0.5,0)),
('Tip', 'Mid2', (0,1,0))
]
straight = createRig('Straight', origin+Vector((0,2,0)), boneTable2)
# ΠΠΎΠ·Π° Π²ΡΠΎΡΠΎΠΉ ΠΎΡΡΠ½Π°ΡΡΠΊΠΈ
poseTable2 = [
('Base', 'X', 90),
('Mid2', 'Z', 45),
('Tip', 'Y', -45)
]
poseRig(straight, poseTable2)
# ΠΠΎΠ·Π° ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΎΡΡΠ½Π°ΡΡΠΊΠΈ
poseTable1 = [
('Tip', 'Y', 45),
('Mid', 'Y', 45),
('Base', 'Y', 45)
]