因此,简而言之,我需要将顶点法线从字符导出到文本文件或其他文件中,然后将它们重新导入到不同场景中的同一角色。
我让导入导出部分以一种我认为可以的方法工作,但实际上通过循环并在每个顶点上设置法线需要花费超过20分钟,并且通常会使我的机器上的ram过载并导致maya崩溃。
我猜我正在寻找一种方法,使我的代码更有效率或只是运行更快,任何建议都将不胜感激。谢谢。
def ImoNorms(self):
ll = mc.ls ('head.vtxFace[*][*]')
input = open('My desktop.txt', 'r')
spltOne = ll[:len(ll)/2]
spltTwo = ll[len(ll)/2:]
i = 0
for each in spltOne:
CurrentLine = input.readline()
kk = re.split(r'\[|\]|\,|\/n|\ ',CurrentLine)
aa = float(kk[1])
aa = round(aa, 3)
bb = float(kk[3])
bb = round(bb,3)
cc = float(kk[5])
cc = round(cc,3)
mc.select(each)
mc.polyNormalPerVertex(xyz =(aa, bb, cc))
i = i + 1
if i%1000 == 0:
print i
init()对于格式化问题,很抱歉,仍然是这个网站的新成员。
发布于 2016-05-20 01:54:49
由于您在网格上创建了大量历史,因此将非常慢:如果在几次迭代后退出循环,您将看到网格在每次迭代中都会累积一个polyNormalPerVertex节点。
不幸的是,没有办法为这个命令转换构建历史(这似乎是一个疏忽:大多数命令都有一个ch标志来实现这个目的)。因此,要尝试的第一件事是在每次polyNormalPerVertex调用后添加一个mc.delete(ch=True)。这将会快得多,而且对你正在做的事情来说可能已经足够了。
否则,您将需要使用OpenMaya应用程序接口,它比cmds稍难一些,但可以让您更快地执行批量普通操作。我会先让cmds版本工作,看看它是否足够好,它应该会在没有历史开销的情况下表现得更好。
更新
除非你想学习API来做这件事,否则正确的做法可能是:
中加载的网格
这使您摆脱了制作自己的文件格式和性能问题的麻烦,此外,它还为您提供了预先准备好的选项,以应对由于某种原因导致拓扑不能对齐的情况
发布于 2016-05-21 00:55:52
如果您想要更好的性能,请使用OpenMaya +1。
查看MFnMesh.getNormals和MFnMesh.setNormals。我承认我自己没有使用过这些方法,但如果它像MFnMesh.setPoints一样,它应该是一个显着的速度提升,因为它一次设置所有的法线。看起来你也不需要处理它的历史。
这里有一个关于它的用法的示例,它将重定向球体的所有垂直法线指向下方。(转到显示->多边形->顶点法线以可视化法线)
import maya.OpenMaya as OpenMaya
# Create a sphere to change vert normals with
mesh_obj, _ = cmds.polySphere()
# Wrap sphere as MDagPath object
sel = OpenMaya.MSelectionList()
sel.add(mesh_obj)
dag_path = OpenMaya.MDagPath()
sel.getDagPath(0, dag_path)
# Pass sphere to mesh function set
mesh_fn = OpenMaya.MFnMesh(dag_path)
# Create empty vector array
vec_array = OpenMaya.MFloatVectorArray()
# Get sphere normals and stuff data in our vector array
mesh_fn.getNormals(vec_array, OpenMaya.MSpace.kObject)
for i in range( vec_array.length() ):
# Point all normals downwards
vec_array[i].assign( OpenMaya.MFloatVector(0, -1, 0) )
# Apply normals back to sphere
mesh_fn.setNormals(vec_array, OpenMaya.MSpace.kObject)您可能还希望考虑一种不同的方式来读取文件,而不是逐行读取。也许可以使用json.dumps将数据存储到文件中,并使用json.loads检索数据。这可能会加快速度。
https://stackoverflow.com/questions/37303345
复制相似问题