2024-4-10-大量部件烘焙批量选中问题用python代码解决

在完成模型制作后,对部件选中批量命名,然后data name from object使网格体名称能够规范化。在SendToUE的工作流中,网格体的名称是static mesh名称,物体名称是场景中的actor名称。对于同一网格体的部件会有多个instance对象,理想中的状况是选中其中一个instance对象烘焙而不需要所有的instance都拿去烘焙,我搜了很久并没有找到对若干包含多组instance的物体选中其中单个instance的办法。后来我想了个思路,既然有插件可以对instance操控必然是可以获取instance的,那么按照网格体分类获取其data name然后移动到各自的collection里面,再从collection着手选取其中一个对象,那么就能实现我的想法了。然而我对python几乎没什么印象了,更别说还要去啃blender python的api文档。抱着死马当活马医的态度,我试了下用kimi人工智能和chatgpt,居然在一番循序渐进的诱导下成功做出了这两段代码。

以前觉得chatgpt什么的都是故弄玄虚,给出来的代码都没啥用,现在看来好像已经进入日常工作、生产了,我估计是某些需求量大的例行工作比如写报告、渲染线稿这种在较大的公司探索出了一套新的工作流结合gpt。我不禁感慨有必要见见世面和社会接触,不然可能自己搞了半天犹如钻木取火,而外界已经开始用电磁灶了。


从我自身的使用来看至少在blender python中需要对程序有一定的了解,能够以程序的思维去编制一个需求。以下是我对chatpgt的诱导,逐渐修改程序至可用。

2024-4-28更新:
使用这两个代码前用rename插件对物体重命名(配合similar object data或material选择),窗都叫window,墙都叫wall等等。场景中的命名完成后全选所有物体data name from object对所有物体的data name修改,有时候执行分集合的代码会出错,在script视图模式下查看outline下面这个大纲,object和collection会存在一些layout的大纲中没有的隐藏物体,删除以后就正常了。执行第二个选择集合中第一个物体的代码后需要再执行一次data name from object,以使得烘焙的贴图命名与static mesh的命名是一样的,这样才能使ue中的auto convert material instance生效。rename插件一定要勾选Numerate,这样统一所有的物体都是下划线加数字后缀,不然会有.加数字后缀,而在ue中.加数字后缀和下划线加数字后缀会互相冲突,导致SendToUE出错覆盖。内景在烘焙之后通过control j合并批量给窗户通过instance关联添加,像图2中有两个并列窗和单体是instance关系,这时合并会导致内景重叠重复一份,因此并列窗要自成一个物体与单体区分开。图3的窗框damage问题是mesh的方向没有转向。


按照网格体分类获取其data name然后移动到以自身data name命名的collection
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  

import bpy

# 获取场景中的所有物体
all_objects = bpy.data.objects

# 创建一个字典,用于存储每个网格体名称对应的集合
mesh_collections = {}

# 遍历每个物体
for obj in all_objects:
# 检查物体是否关联了网格
if obj.type == 'MESH' and obj.data:
# 获取物体的网格体名称
mesh_name = obj.data.name

# 检查集合是否存在,如果不存在则创建
if mesh_name not in mesh_collections:
new_collection = bpy.data.collections.new(mesh_name)
bpy.context.scene.collection.children.link(new_collection)
mesh_collections[mesh_name] = new_collection

# 将物体从场景集合中移除
bpy.context.scene.collection.objects.unlink(obj)

# 将物体移动到对应的集合中
mesh_collections[mesh_name].objects.link(obj)

选取每个collection中的第一个物体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

import bpy

# 获取所有集合
collections = bpy.data.collections

# 清除选择
bpy.ops.object.select_all(action='DESELECT')

# 用于存储已经选择的物体,以避免重复选择
selected_objects = set()

# 遍历每个集合
for collection in collections:
# 获取集合中的所有物体
objects_in_collection = collection.objects

# 如果集合中有物体,选择第一个物体并将其添加到已选择物体集合中
if objects_in_collection:
first_object = objects_in_collection[0]
if first_object not in selected_objects:
first_object.select_set(True)
selected_objects.add(first_object)

测试都没问题!

2024-4-9-第二套UV的必要性 2024-4-2-BluePrint探索自研DecoPerSocket

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×