見出し画像

【Blender Python】平面でオブジェクトを切断する

平面でオブジェクトを切断する方法を紹介します。
流石にこれだけでは芸がないので、必要なオブジェクトだけ切断する例を作ってみました。

Blenderのバージョンは2.93 LTSです。

1. コード

import bpy


# 既存のメッシュオブジェクトを削除
for msh in bpy.data.meshes:
   bpy.data.meshes.remove(msh)


# 3つの立方体を配置
bpy.ops.mesh.primitive_cube_add(location=(-3, 0, 0))
my_cube1 = bpy.context.object
my_cube1.name = 'cube_a_1'

bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
my_cube2 = bpy.context.object
my_cube2.name = 'cube_b'

bpy.ops.mesh.primitive_cube_add(location=(3, 0, 0))
my_cube3 = bpy.context.object
my_cube3.name = 'cube_a_2'


# 平面を配置
verts = [[-5, -2, -1], [5, -2, -1], [5, 2, 1], [-5, 2, 1]]
faces1 = [[3, 2, 1, 0]]

msh1 = bpy.data.meshes.new("cubemesh1") #Meshデータの宣言
msh1.from_pydata(verts, [], faces1) # 頂点座標と各面の頂点の情報でメッシュを作成
my_plane1 = bpy.data.objects.new("plane1", msh1) # メッシュデータでオブジェクトを作成
bpy.context.scene.collection.objects.link(my_plane1) # シーンにオブジェクトを配置


# 必要なオブジェクトだけ切断する
for obj in bpy.data.objects:
   if 'cube_a' in obj.name:

       # Modifierを追加
       mod1 = obj.modifiers.new('bool1', 'BOOLEAN')
       mod1.operation = 'DIFFERENCE'
       mod1.object = my_plane1
       mod1.solver = 'EXACT'

       # Modifierを適用
       bpy.context.view_layer.objects.active = obj
       bpy.ops.object.modifier_apply(modifier='bool1')


# 不要な平面を除去
bpy.data.objects.remove(my_plane1, do_unlink=True)

名前に 'cube_a' が含まれているオブジェクトのみ切断します。

切断した後にどちら側が残るのかは平面の向きによるので、平面を作成するときには方向に気を付けましょう。

平面の作り方は前回の記事

とは違いますが、どちらのやり方でも同じように動きます。

2. 実行結果

画像1

真ん中の立方体(cube_b)は切断されていないのが分かりますね。

まとめ

今回は平面でオブジェクトを切断する方法を紹介しました。

切断面の形状がどんな風になっているか知りたい、みたいなときに使えるかと思います。

この記事が気に入ったらサポートをしてみませんか?