gpt4 book ai didi

python - blender 2.8 python,使用 bisect 将对象分成两半会产生错误的结果

转载 作者:行者123 更新时间:2023-12-04 17:31:11 28 4
gpt4 key购买 nike

我使用 Blender 2.8 创建了一个复杂的对象,我想将其拆分为两个单独的对象。

我遵循的过程(所有脚本):创建对象;重复对象;进入编辑模式并使用“clear_inner=True”一分为二。 (工作完美!)然后选择其他(原始)对象;进入编辑模式并使用“clear_outer=True”一分为二。现在第一个对象似乎也受到平分:只有一些点/面被平分。

我包含了一个简单立方体的代码:

import bpy

bpy.ops.mesh.primitive_cube_add(size=4, enter_editmode=False, location=(0, 0, 0))
bpy.context.object.name="left"

bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":False, "mode":'TRANSLATION'})
bpy.context.object.name="right"

# cutting in two (bisect)

bpy.data.objects['left'].select_set(False)
bpy.data.objects['right'].select_set(True)

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.bisect(plane_co=(0, 28.5249, 5.80484), plane_no=(1, 0, 0), use_fill=True, clear_inner=True, threshold=0.0001, xstart=1042, xend=1068, ystart=647, yend=130)
bpy.ops.object.editmode_toggle()

bpy.data.objects['right'].select_set(False)
bpy.data.objects['left'].select_set(True)

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.bisect(plane_co=(0, 28.5249, 5.80484), plane_no=(1, 0, 0), use_fill=True, clear_outer=True, threshold=0.0001, xstart=1042, xend=1068, ystart=647, yend=130)
bpy.ops.object.editmode_toggle()

using bisect to seperate cube in two halfs

在图片中,您看到第二个平分的结果成功地将第一个立方体(“左”)减半。但它也 split 了复制的立方体('右'),它已经被减半,只在平分平面上产生一个面。

为什么不起作用?我究竟做错了什么?

最佳答案

问题是由第二个bpy.ops.mesh.select_all(action='SELECT')引起的。这些都不需要,因为在您更改之前会选择整个网格。这会导致选择两个立方体的网格,然后对它们进行平分。这是可能的,因为 Blender 2.80 允许您一次编辑多个对象。不过,问题的根源是 select_set(False)。这将取消选择对象,但不会更改其事件状态。当您切换第二个多维数据集的编辑模式时,您正在编辑两者,因为一个被选中并且第二个处于事件状态。您可以通过删除代码的最后 3 行来尝试,您将看到发生了什么。您必须通过设置 bpy.context.view_layer.objects.active 来更改它,如第二个代码所示。

此外,您不需要填写 bpy.ops.mesh.bisect 函数的所有参数,plane_co 是切割平面上的点,我认为它应该为零但是这取决于你。

文档:https://docs.blender.org/api/current/bpy.ops.mesh.html?highlight=mesh#bpy.ops.mesh.bisect

使用 bpy.ops.object.select_all(action='DESELECT') 编辑代码:

...

# deselect all objects
bpy.ops.object.select_all(action='DESELECT')

# select just right object
bpy.data.objects['right'].select_set(True)

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.bisect(plane_co=(0, 0, 0), plane_no=(1, 0, 0), use_fill=True, clear_inner=True)
bpy.ops.object.editmode_toggle()

# deselect all objects
bpy.ops.object.select_all(action='DESELECT')

# select just left object
bpy.data.objects['left'].select_set(True)

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.bisect(plane_co=(0, 0, 0), plane_no=(1, 0, 0), use_fill=True, clear_outer=True)
bpy.ops.object.editmode_toggle()

这个也有效——使用 bpy.context.view_layer.objects.active:

...

bpy.data.objects['left'].select_set(False)
bpy.data.objects['right'].select_set(True)
bpy.context.view_layer.objects.active = bpy.data.objects['right'] # set right as active

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.bisect(plane_co=(0, 0, 0), plane_no=(1, 0, 0), use_fill=True, clear_inner=True)
bpy.ops.object.editmode_toggle()

bpy.data.objects['right'].select_set(False)
bpy.data.objects['left'].select_set(True)
bpy.context.view_layer.objects.active = bpy.data.objects['left'] # set left as active

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.bisect(plane_co=(0, 0, 0), plane_no=(1, 0, 0), use_fill=True, clear_outer=True)
bpy.ops.object.editmode_toggle()

关于python - blender 2.8 python,使用 bisect 将对象分成两半会产生错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59560928/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com