Dev:JA/2.5/Py/Scripts/Cookbook/Code snippets/Meshes
Meshes
Mesh
このプログラムは2つのメッシュを作ります。1つは 三角面と四角面の両方を持つ solid な pyramid です。もう1つは wire の三角形です。どちらもメッシュ名を表示します。三角形を移動して pyramid の隣になるように離します。このためには選択されている必要があります。
#----------------------------------------------------------
# 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, [])
# 2つ目のオブジェクトを邪魔にならないように移動
ob1.select = False
ob2.select = True
bpy.ops.transform.translate(value=(0,2,0))
return
if __name__ == "__main__":
run((0,0,0))
vertex group と shapekey
このプログラムは2つの vertex group(左右)と4つの shapekey を持つ UV Sphereを追加します。
#----------------------------------------------------------
# File shapekey.py
#----------------------------------------------------------
import bpy, random
def run(origin):
# UV sphere を追加
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
# 左右の vertex groups を作成
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 key を追加
bpy.ops.object.shape_key_add(None)
basis = ob.active_shape_key
# FrontForward key を追加: 前にある頂点を 1unit 前に移動
# 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 keys を追加: 上の頂点を 1unit 上に移動。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
# shape key をポージング
for shape in ob.data.shape_keys.key_blocks:
shape.value = random.random()
return
if __name__ == "__main__":
# ランダムな shapekey で5つオブジェクトを作成
for j in range(5):
run((3*j,0,0))
array modifier の適用
このプログラムは 10個の輪を繋いだ鎖を作ります。輪はプリミティブの torus を x軸方向に縮小したものです。輪には、offset を empty で操作する array modifier を与えます。最終的には array modifier を適用して、鎖を1つのメッシュにします。
#----------------------------------------------------------
# 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):
# シーンに1つ輪を追加
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))
# torus を x軸に沿って縮小
ob = bpy.context.object
ob.scale = (0.7, 1, 1)
bpy.ops.object.transform_apply(scale=True)
# empty を作成
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
# modifier を追加
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
# modifier の適用
bpy.ops.object.visual_transform_apply()
bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Chain')
# 鎖を本来の場所へ移動
bpy.ops.transform.translate(value=origin)
# empty はもう不要です
scn.objects.unlink(empty)
del(empty)
return
if __name__ == "__main__":
run((0,3,0))