gpt4 book ai didi

python - 使用 Blender Python API 2.6 选择性导出场景对象

转载 作者:行者123 更新时间:2023-12-01 05:35:52 25 4
gpt4 key购买 nike

我正在编写一个自定义导出脚本来解析 blender 文件中的所有对象,按名称过滤它们,然后检查以确保它们满足某些特定条件。

我使用的是 Blender 2.68a。我创建了一个混合器文件,其中包含一些基本的 2d 和 3d 网格,以及一些不符合我的测试标准的网格。我正在 Blender 的内部 Python 控制台中工作。这是使用 Blender Python API 的唯一方法,因为它们的 Python 环境是定制的。

我已经排序了如何使用 for 循环和 D.objects 迭代器迭代对象,然后使用正则表达式检查名称匹配,然后使用以下方法从对象获取网格:

mesh = obj.to_mesh(C.scene, True, 'RENDER') #where obj is an bpy.data.object[index] in the scene
mesh.update(True, True)
mesh.polygons[index].<long list of possible functions>

让我访问一个多边形数组,以了解是否存在一组具有形成多边形的边的顶点,以及它们的键值是什么。

我无法解决的是如何从 python 控制台确定多边形是面还是只是多边形。是否有内置函数,或者我可以执行哪些测试来以编程方式确定这一点?例如,我可以有一个网格 4 个顶点,4 个边没有面,我不想导出它,但如果我要编辑相同的 4 个顶点/边并在其上放置一个面,那么它成为理想的导出产品。

任何人都可以解释 bpy.data.object 数据结构或解释“面孔”的存储位置吗?看起来好像它是 npoly 本身的一个属性,但 API 并没有让它变得显而易见。任何澄清这一点的帮助将不胜感激。干杯。

最佳答案

所以,我在 Blender.org 论坛上问了这个问题,http://www.blender.org/forum/viewtopic.php?t=28286&postdays=0&postorder=asc&start=0在过去的几天里,每次我在自己的努力中陷入困境时,一个非常乐于助人的人都会帮助我。

简短的答案列表是:

1) 所有多边形都是面。如果它没有存储为多边形,那么它就不是面。
2)在对象上使用 to_mesh() 函数会返回该函数的副本,因此对副本所做的任何选择都不会反射(reflect)在上下文中,因此我使用的方法是有缺陷的。访问事件对象的唯一方法是使用:

bpy.data.objects[<index or object name>].data.vertices[<index>].co[<0,1,2> which correspond to x,y,z respectively]  
bpy.data.objects[<index or object name>].data.polygons[<index>].edge_keys

第一个使您可以访问对象中所有顶点的有序索引(假设其类型为“MESH”)及其坐标。
第二个使您可以访问代表边的有序对的二维数组。它在元组中包含的数字对应于第一个命令中顶点列表中的索引值,因此您可以获得边之间的坐标。还可以创建一个新的 BMesh 对象,并将您感兴趣的对象复制到 BMesh 中。这为您提供了更多无法在事件对象上访问的功能。答案 3 中的代码显示了一个示例。

3)请参阅下文,了解有关检查网格中的面的问题的答案。

事实证明,确定一个对象是否有面且所有边都是面的一部分的一种方法是使用由有用的用户 CoDEmanX 在上述线程上编写的以下代码片段。

import bpy, bmesh 

for ob in bpy.context.scene.objects:
if ob.type != 'MESH':
continue
bm = bmesh.new()
bm.from_object(ob, bpy.context.scene)

if len(bm.faces) > 0 and 0 not in (len(e.link_faces) for e in bm.edges):
print(ob.name, "is valid")
else:
print(ob.name, "has errors")

我对此做了一些更改,因为我不希望它循环遍历所有对象,而是将其作为一个函数,如果传入的对象有效则返回 true,否则返回 false。这让我可以序列化我的调用,以便我的插件仅尝试验证名称与正则表达式匹配的对象。

def validate(obj):
import bpy, bmesh

if obj.type == 'MESH':
bm = bmesh.new()
bm.from_object(obj, bpy.context.scene)

if len(bm.faces) > 0 and 0 not in (len(e.link_faces) for e in bm.edges):
return True
return False

关于python - 使用 Blender Python API 2.6 选择性导出场景对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19101662/

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