Hi Michael!
Thanks so much for the tip. I had a look at the function you mentioned and
wrote this as improvement using that. From what I've tested it performs on
meshes up to 900k faces in roughly 0.7 seconds compared to roughly 8
seconds for the old version.
I'm pretty sure this is still not the fastest way to do this, but it's
already way faster than it was before. So if you have any other improvement
points I'd like to hear it!
def geo_weights_to_surface(source, target, tol=0.005, space=om.MSpace.kWorld):
start = time.time()
# Mesh
mesh_sel = om.MSelectionList().add(source)
mesh_dag_path = mesh_sel.getDagPath(0)
mesh_dag_path.extendToShape()
mesh = om.MFnMesh(mesh_dag_path)
mesh_node = om.MFnDependencyNode(mesh_dag_path.node())
mesh_attr = mesh_node.attribute('inMesh')
mesh_plug = mesh_node.findPlug(mesh_attr, 0)
mesh_sc_array = mesh_plug.connectedTo(True, False)
mesh_sc_node = mesh_sc_array[0].node()
mesh_sc = oma.MFnSkinCluster(mesh_sc_node)
mesh_influences = mesh_sc.influenceObjects()
# Surface
surf_sel = om.MSelectionList().add(target)
surf_dag_path = surf_sel.getDagPath(0)
shape_nr = surf_dag_path.numberOfShapesDirectlyBelow()
# Append shapes to array
shapes = om.MDagPathArray()
for idx in range(shape_nr):
dag_path = surf_sel.getDagPath(0)
dag_path.extendToShape(idx)
shapes.append(dag_path)
for item in range(len(shapes)):
surf_dag_path = surf_sel.getDagPath(0)
surf_dag_path.extendToShape(item)
shape_node = om.MFnDependencyNode(surf_dag_path.node())
surf_attr = shape_node.attribute('create')
surf_plug = shape_node.findPlug(surf_attr, 0)
surf_sc_array = surf_plug.connectedTo(True, False)
surf_sc_node = surf_sc_array[0].node()
surf_sc = oma.MFnSkinCluster(surf_sc_node)
surf = om.MFnNurbsSurface(shapes[item])
surf_itr = om.MItSurfaceCV(shapes[item])
while not surf_itr.isDone():
while not surf_itr.isRowDone():
pos = surf_itr.position()
float_pos = om.MFloatPoint(pos.x, pos.y, pos.z)
uvs = surf_itr.uvIndices()
cv_normal = surf.normal(uvs[0], uvs[1], space=space)
dir_vector = om.MFloatVector(cv_normal.x, cv_normal.y,
cv_normal.z)
facenr = mesh.closestIntersection(float_pos, dir_vector, space,
0.05, True)[2]
face_sel = om.MSelectionList().add(source + '.f[' + str(facenr)
+ ']')
face_component = face_sel.getComponent(0)[1]
face_itr = om.MItMeshFaceVertex(mesh_dag_path, face_component)
while not face_itr.isDone():
if face_itr.position().isEquivalent(pos, tol):
vtx_idx = face_itr.vertexId()
idx_sel = om.MSelectionList().add(source + '.f[' +
str(vtx_idx) + ']')
vtx = idx_sel.getComponent(0)[1]
for mesh_inf in range(len(mesh_influences)):
mesh_inf_idx = mesh_sc.indexForInfluenceObject(
mesh_influences[mesh_inf])
vtx_weight = mesh_sc.getWeights(mesh_dag_path, vtx,
mesh_inf_idx)
vtx_blend_weight =
mesh_sc.getBlendWeights(mesh_dag_path, vtx)
cv_uv = surf_itr.uvIndices()
cv_component =
om.MFnNurbsSurface(surf_dag_path).cv(cv_uv[0], cv_uv[1])
surf_inf_idx = surf_sc.indexForInfluenceObject(
mesh_influences[mesh_inf])
surf_sc.setWeights(surf_dag_path, cv_component,
surf_inf_idx,
vtx_weight[0], normalize=True)
surf_sc.setBlendWeights(surf_dag_path,
cv_component, vtx_blend_weight)
face_itr.next()
surf_itr.next()
surf_itr.nextRow()
print 'Copying weights took', time.time() - start, 'seconds.'
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/3551d64d-91bb-48c1-a1e4-718d0f05a6ba%40googlegroups.com.