5月重叠顶点

2024-10-04 01:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到距离小于0.0003的所有顶点,并将它们作为列表返回。我使用下面的算法,但是对于大场景来说速度很慢。你对提高速度有什么建议吗?在

listOfAllMesh = cmds.ls(geometry=True,type="mesh")
overlapping = []
for meshToCek in listOfAllMesh:
    listOFVertex=[]
    cmds.select(meshToCek)
    mel.eval("ConvertSelectionToVertices")
    AllVertexes = cmds.ls(selection=True, flatten=True)
    listOFVertex.append(AllVertexes[0])
    Flag=False
    for VertexToCek in AllVertexes[1:]:
        c1=cmds.xform(VertexToCek, q=True, os=True, a=True, t=True)
        for cek in listOFVertex:
            c2=cmds.xform(cek, q=True, os=True, a=True, t=True)
            distance = math.sqrt(math.pow(c2[0] - c1[0], 2) + math.pow(c2[1] - c1[1], 2) + math.pow(c2[2] - c1[2], 2))
            if distance<0.0003:
                overlapping.append(VertexToCek)
                overlapping.append(cek)
                Flag=True
        if not Flag:
            listOFVertex.append(VertexToCek)
            Flag=False
return overlapping

Tags: intrueformathflagc2cmdsc1
2条回答

@UnholySheep的bb交叉检查应该是第一步,但是你的问题有两个主题:

  • 第一种方法是快速找到所有顶点的位置 python api in maya
  • 第二个是比较N个点之间的距离, 使用numpy非常快

对于第二步,我建议您编写自己的C模块,它可以在python中调用。创建一个沙盒maya场景,并使用不同的方法测量时间

run_t = timeit.default_timer()
test_find_all_vertices_method_a()
print(timeit.default_timer() - run_t)

run_t = timeit.default_timer()
test_find_all_vertices_method_b()
print(timeit.default_timer() - run_t)

我希望我能正确地理解你是在测试一个物体的顶点!在

我能想到的一些事情可能会减慢您的代码:

xform可能是获取点位置的较慢方法。在

distance = math.sqrt(math.pow(c2[0] - c1[0], 2) + math.pow(c2[1] - c1[1], 2) + math.pow(c2[2] - c1[2], 2)) 这可能是另一个罪魁祸首。通常在计算距离时,平方根会减慢速度。解决这个问题的一种方法是计算平方距离,这样就完全避免了使用math.sqrt。在

cmds.select(meshToCek)
mel.eval("ConvertSelectionToVertices")

这可能不会减慢速度,但在内存中获取顶点可能会更好。在

我尝试了一种严格的mayaapi方法,性能似乎更好。也许有更好的方法来优化,但我们在这里取得了一些进展!在

^{pr2}$

mfn_mesh_generator是一个python生成器,可以循环使用场景中的所有MFnMesh对象。如果你想用另一种方式收集你的网格,你可以随意改变它(我这样做只是为了把东西分开,使它更通用)。幸运的是,api的MPoint对象有一个方法distanceTo,可以计算另一个{}之间的距离!另外,MFnMesh有一个方法可以用getPoints一下子得到所有顶点。这比一个接一个地得到优化。在

在5个多球体的场景中,大约需要0.667850017548秒。与您的方法相同的场景出现在大约12.1129710674秒。相当不错的速度提升!在

希望这对你有所帮助并给你一些想法。在

相关问题 更多 >