Dev:JA/2.5/Py/Scripts/Cookbook/Code snippets/Meshes

提供: wiki
移動先: 案内検索

Meshes

Mesh

このプログラムは2つのメッシュを作ります。1つは 三角面と四角面の両方を持つ solid な pyramid です。もう1つは wire の三角形です。どちらもメッシュ名を表示します。三角形を移動して pyramid の隣になるように離します。このためには選択されている必要があります。 Code Snippets Meshes.png

#----------------------------------------------------------
# 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を追加します。 Code Snippets ShapeKey.png

#----------------------------------------------------------
# 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つのメッシュにします。

Code Snippets Chain.png

#----------------------------------------------------------
# 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))