我想找到距离小于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
@UnholySheep的bb交叉检查应该是第一步,但是你的问题有两个主题:
对于第二步,我建议您编写自己的C模块,它可以在python中调用。创建一个沙盒maya场景,并使用不同的方法测量时间
我希望我能正确地理解你是在测试一个物体的顶点!在
我能想到的一些事情可能会减慢您的代码:
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
。在这可能不会减慢速度,但在内存中获取顶点可能会更好。在
我尝试了一种严格的mayaapi方法,性能似乎更好。也许有更好的方法来优化,但我们在这里取得了一些进展!在
^{pr2}$mfn_mesh_generator
是一个python生成器,可以循环使用场景中的所有MFnMesh
对象。如果你想用另一种方式收集你的网格,你可以随意改变它(我这样做只是为了把东西分开,使它更通用)。幸运的是,api的MPoint
对象有一个方法distanceTo
,可以计算另一个{MFnMesh
有一个方法可以用getPoints
一下子得到所有顶点。这比一个接一个地得到优化。在在5个多球体的场景中,大约需要
0.667850017548
秒。与您的方法相同的场景出现在大约12.1129710674
秒。相当不错的速度提升!在希望这对你有所帮助并给你一些想法。在
相关问题 更多 >
编程相关推荐