Hey #b3d peeps!!
メッシュまたはカーブを選択した状態で以下のスクリプトを実行すると、オブジェクトのバウンディングボックスに一致するLatticeを追加し、Lattice変形ができるところまでを自動で行うコードサンプルです。コード実行後目的のオブジェクトにLatticeモディファイアを追加します。
「事前にオブジェクトを囲むようにLatticeの位置やサイズ、回転を手動で調整する」という手間が省けます。
Blender 2.76 RC3で動作を確認しています。
Add-on にしてみました → [Add-on]
import bpy import mathutils def addcoordinatedlattice(obj): maxx = maxy = maxz = None minx = miny = minz = None for v in obj.bound_box: maxx= max(v[0],maxx) if maxx!=None else v[0] maxy= max(v[1],maxy) if maxy!=None else v[1] maxz= max(v[2],maxz) if maxz!=None else v[2] minx= min(v[0],minx) if minx!=None else v[0] miny= min(v[1],miny) if miny!=None else v[1] minz= min(v[2],minz) if minz!=None else v[2] # get center of boundingbox cx = (maxx +minx ) /2 cy = (maxy +miny ) /2 cz = (maxz +minz ) /2 # get boundingbox size sx = (maxx -minx ) sy = (maxy -miny ) sz = (maxz -minz ) # get lattice location (= boundingbox center) cv = mathutils.Vector((cx,cy,cz)) dv = mathutils.Vector(x * y for x, y in zip(cv, obj.scale)) eul = obj.rotation_euler dv.rotate(eul) loc = obj.location + dv # add lattice bpy.ops.object.add(radius=1, type='LATTICE', view_align=False, enter_editmode=False, location=loc, layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)) lat = bpy.context.object # set lattice rotation and size lat.rotation_euler = obj.rotation_euler sv = mathutils.Vector((sx,sy,sz)) lat.scale= mathutils.Vector(x * y for x, y in zip(sv, obj.scale)) # make parents with lattice deform (obj -> lat) obj.select = True bpy.ops.object.parent_set(type='LATTICE') if __name__ == '__main__': if bpy.context.mode == 'OBJECT': obj = bpy.context.object if obj.type == 'MESH' or obj.type == 'CURVE': addcoordinatedlattice(obj) else: print("This is only for mesh or curve.") else: print("Please change the mode to Object mode.")
Latticeを追加したいオブジェクトを選択して実行します。
3Dビュー上で対象となるオブジェクトを右クリック選択します。メッシュまたはカーブ形状。
Blenderのテキストエディタに上記リストをコピーします。
テキストエディタにあるRun Scriptボタンを押して実行します。
実行後、Latticeを選択してUVWの分割数などを変更、頂点を編集して変形できます。
コードサンプルなので、あまり親切ではありません。
obj.bound_boxで取得しているバウンディングボックスの座標は対象オブジェクトのサイズ、回転による実際の値ではなく、その座標変換する前のものです。これを変換しています。
Latticeのオブジェクト原点 = 対象オブジェクトの座標 + (対象オブジェクトのバウンディングボックスの中間値 * 対象オブジェクトのサイズ)
Latticeの回転 = 対象オブジェクトの回転
Latticeのサイズ .= 対象オブジェクトのバウンディングボックスの値 * 対象オブジェクトのサイズ
latticeはサイズを変更してオブジェクトを覆うように設置する必要があります。そのあとデフォームの関連付けを親子関係により行います。
対象のオブジェクトが親を持つ場合は考慮していません。