(1)
软件功能总是不够完善啊,今天来羡慕什么软件呢?就羡慕一下3dcoat的体素切割吧!
一个字形容,那就是爽
blen的雕刻功能已经很强了,但是却没有好的切割方法,也许有但是我不知道?希望有人告知
(2)
总之进入正题
老外做了个可以用gpencil切割的插件,Flow Tools,里面甚至还有z球,不过我的2.81并不能运行这个插件,最近他也不更新了,这就叫靠山山倒吗?
然后,经过两天查询指令,我组合出了一个简陋版切割工具,因为原理是布尔,所以我就起了个听起来很牛逼的名字,曲线布尔工具v1.01版
看看效果
再放几张
目前还有很多问题,比如操作很麻烦,只在正交模式效果凑合,而且老切不干净,用作差集的面也老是删不掉,还老是丢失切面。
不过嘛,whatever!我又不会编程!懒得改bug!
开玩笑的,以后学明白了大概会改,大概
(3)
说说思路吧,首先是添加用于布尔的曲线
代码如下:
tempempty = bpy.context.object.name #把要切割的物体的名称保存
bpy.context.object.name = 'obj_bool' #然后改为一个固定名称
bpy.ops.object.empty_add(type='PLAiN_AXES', location=(0, 0, 0))
bpy.context.object.name = tempempty+'_temp' #创建一个空物体用于保存名称
bpy.ops.curve.primitive_bezier_curve_add(radius=1, enter_editmode=False, location=(0, 0, 0))
bpy.ops.object.editmode_toggle()
bpy.ops.curve.delete(type='VERT') #添加曲线并删除所有点
为啥要保存名称呢?因为我找了半天也找不到‘怎么在两个脚本之间传递名称’的方法
【注意】顺便说一句,python代码似乎不能有任何中文,注释也不能是中文,具体怎么改中文,请自行百度
(4)
第二组代码创建用于布尔的物体,在用自由线或其他工具创建曲线后执行以下代码
bpy.ops.curve.cyclic_toggle() #切换曲线是否循环
bpy.ops.object.editmode_toggle()
bpy.ops.object.convert(tARget='MESH') #曲线转化为mesh
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.fill() #填充这个封闭区域
# Extrude a long distance #沿法线方向挤出一次
bpy.ops.mesh.extrude_region_shrink_fatten(MESH_OT_extrude_region={"use_normal_flIP":False, "mirror":False}, TRANSFORM_OT_shrink_fatten={"value":1000, "use_even_offset":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), "release_/confirm/i":True, "use_accurate":False})
bpy.ops.mesh.select_all(action='INVERT') #沿反方向再挤出一次
bpy.ops.mesh.extrude_region_shrink_fatten(MESH_OT_extrude_region={"use_normal_flip":False, "mirror":False}, TRANSFORM_OT_shrink_fatten={"value":1000, "use_even_offset":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), "release_/confirm/i":True, "use_accurate":False})
bpy.ops.object.editmode_toggle()
# Rename
bpy.context.object.name = 'obj_remove' #将差集物体命名为一个固定名称
remove1 = bpy.data.objects['obj_remove']
bool1 = bpy.data.objects['obj_bool'] #这一行用到了之前的名称
# Select obj_bool and do Boolean #执行布尔运算
bool1.select_set(True)
bpy.context.view_layer.objects.active = bool1
bpy.ops.object.modifier_add(type='BOOLEAN')
bpy.context.object.modifiers["Boolean"].operation = 'DIFFERENCE'
bpy.context.object.modifiers["Boolean"].object = bpy.data.objects['obj_remove']
bpy.ops.object.modifier_APPly(APPly_as='DATA', modifier="Boolean")
bool1.select_set(False)
# Delete obj_remove #删除差集物体
remove1.select_set(True)
bpy.context.view_layer.objects.active = remove1
bpy.ops.object.delete(use_global=False, confirm=False)
# Rename again #恢复之前保存的名称
bool1.select_set(True)
bpy.context.view_layer.objects.active = bool1
for i in bpy.context.visible_objects:
if '_temp' in i.name:
bpy.context.object.name = i.name.replace('_temp', '')
bool1.select_set(False)
for i in bpy.context.visible_objects:
if '_temp' in i.name:
i.select_set(True)
bpy.context.view_layer.objects.active = i
bpy.ops.object.delete(use_global=False, confirm=False) #删除用于保存名称的空物体
bool1.select_set(True)
bpy.context.view_layer.objects.active = bool1
(5)
我把这个功能加入了我自制的热盒
以下为操作流程
[1]下图,选择物体
[2]下图,shift+中键打开热盒,我把它放在了“上”方向。图标都没改,其他7个方向的功能也还没完善,不过不要在意那些细节
[3]下图,场景产生了一个空曲线和一个空物体,并且被切割物体改名了
[4]下图,这时用上面两种曲线工具绘制曲线
下图,比如我用了自由线工具
[5]下图,在编辑模式按shift+鼠标中键唤出另一个热盒,功能还是在“上”方向
[6]下图,最后得到这个结果
(6)
虽然代码不完善,不过我还是贴上来以供参考
和上次一样,还是放在2.81/scripts/addons/space_view3d_pie_menus里
记得覆盖或者修改你的代码之前备份