【Blender】Pythonで関数のモデリング

posted in: 3D Modeling | 0

Blenderによるモデリングの際、頂点を任意の関数に従って配置したいと思ったことはありますか?

このような作業は、手作業ではかなり困難となることが予想されますが、これを自動的に実行する手法があります

それは、Pythonによるプログラミングです

実は、BlenderではPythonを用いることが標準機能として可能となっています

そこで今回は、このプログラミングという手法を利用し、任意の関数に従って頂点をプロットする方法をお解説します

必要な操作

スクリプトを書く前に、わずかな手作業があります

これは上図に示した通り、①Scriptingタブを選択することと、②その下の「+New」を選択し、テキストデータブロックを新規作成することです

生じたテキストデータブロックには、本ページ下部に示されているスクリプトを記します

このスクリプトの実行は、再生ボタンをクリックすることで可能です

また、このスクリプト中で定義しているx_co, y_co, z_coという変数を新しく定義することで、任意の関数を描き出すことができます!

スクリプトの内容については、本動画において詳細に解説しておりますので、気になる方はぜひご覧ください

スクリプト

import bpy
import math

bpy.ops.mesh.primitive_vert_add()

for i in range(0,1000):
    x_co = i/50*math.pi #EDIT
    y_co = 0 #EDIT
    z_co = math.sin(i/50*math.pi) #EDIT
    
    #g key
    bpy.ops.transform.translate(value=(x_co, y_co, z_co), 
    orient_axis_ortho='X', orient_type='GLOBAL', 
    orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), 
    orient_matrix_type='GLOBAL', 
    constraint_axis=(True, False, False), 
    mirror=True, use_proportional_edit=False, 
    proportional_edit_falloff='SMOOTH', 
    proportional_size=1, use_proportional_connected=False, 
    use_proportional_projected=False)
    
    #e key
    bpy.ops.mesh.extrude_region_move(MESH_OT_extrude_region={"use_normal_flip":False, 
    "use_dissolve_ortho_edges":False, "mirror":False}, 
    TRANSFORM_OT_translate={"value":(-x_co, -y_co, -z_co), 
    "orient_axis_ortho":'X', "orient_type":'GLOBAL', 
    "orient_matrix":((1, 0, 0), (0, 1, 0), (0, 0, 1)), 
    "orient_matrix_type":'GLOBAL', 
    "constraint_axis":(False, False, False), 
    "mirror":False, "use_proportional_edit":False, 
    "proportional_edit_falloff":'SMOOTH', 
    "proportional_size":1, 
    "use_proportional_connected":False, 
    "use_proportional_projected":False, 
    "snap":False, "snap_target":'CLOSEST', 
    "snap_point":(0, 0, 0), "snap_align":False, 
    "snap_normal":(0, 0, 0), "gpencil_strokes":False, 
    "cursor_transform":False, "texture_space":False, 
    "remove_on_cancel":False, "view2d_edge_pan":False, 
    "release_confirm":False, "use_accurate":False, 
    "use_automerge_and_split":False})

bpy.ops.transform.translate(value=(x_co, y_co, z_co), 
orient_axis_ortho='X', orient_type='GLOBAL', 
orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), 
orient_matrix_type='GLOBAL', 
constraint_axis=(True, False, False), 
mirror=True, use_proportional_edit=False, 
proportional_edit_falloff='SMOOTH', 
proportional_size=1, use_proportional_connected=False, 
use_proportional_projected=False)


コメントを残す