如何在玛雅找到脸部邻居?

2024-05-26 21:54:05 发布

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

我有一个问题,我需要选择一个预先选择的面旁边的面。在

这可能很容易做到,但问题是,当我得到一个邻居的脸时,我需要知道它朝向哪个方向。在

所以现在我可以选择与边连接的面,但是我不能从第一个选择的面中获得例如左或右的面。我试过多种方法,但都找不到解决办法。在

我试过了:

  1. pickwall-cmds.pickWalk()-问题是它的行为无法预测,因为它是从摄影机的角度来行走网格的。

  2. polyInfo-cmds.polyInfo()-这是一个非常有用的函数,最接近答案。在这种方法中,我尝试从一个面提取边,然后用edgeToFace()来查看哪些是该面的邻居。这很管用,但解决不了我的问题。更详细地说,当polyInfo返回共享边的面时,它的返回方式并不是我总能知道edgesList[0](例如)是指向左或右的边。因此,如果我在不同的面上使用这个,在每种情况下,得到的面可能朝向不同的方向。

  3. 很难有很多从顶点到边再到面等的转换,但同样的问题是我不知道哪条边是顶部还是左侧。

  4. conectedFaces()方法,我调用选定的面,它返回与第一个面连接的面,但仍然是相同的问题,我不知道哪个面面向哪个方向。

为了清楚起见,我没有使用预先选择的面孔列表并检查它们,但我需要知道这些面孔,而不知道它们的名字或将它们保存在某个地方。有人知道一种选择面孔的方法吗?在

为了详细说明我的问题,我做了一个形象来说明:

example

正如你从例子中看到的,如果有选择的面,我需要选择任何一个指向的面,但那必须是我要选择的确切的面。其他方法选择所有相邻面,但我需要的方法,我可以说“选择正确”,并将从第一个选择的面选择正确的一个。在


Tags: 方法函数答案网格方向指向角度cmds
3条回答

polyListComponentConversion

import pprint
init_face = cmds.ls(sl=True)

#get edges
edges = cmds.polyListComponentConversion(init_face, ff=True, te=True)
#get neighbour faces
faces = cmds.polyListComponentConversion(edges, fe=True, tf=True, bo=True)
# show neighbour faces
cmds.select(faces)
# print face normal of each neighbour face
pprint.pprint(cmds.ployInfo(faces,fn=True))

在上/下/左/右与网格的变换(局部空间)对齐的规则下,这是一个相当一致的解决方案,尽管也可以是世界空间。在

我要做的第一件事是使用网格变换的平均面顶点位置、面法线和世界空间Y轴为每个网格面建立一个面相对坐标系。这涉及到一些向量数学,所以我将使用API来简化这一过程。第一部分将为每个面创建一个坐标系,我们将把它存储到列表中,以便将来查询。见下文。在

from maya import OpenMaya, cmds

meshTransform = 'polySphere'
meshShape = cmds.listRelatives(meshTransform, c=True)[0]

meshMatrix = cmds.xform(meshTransform, q=True, ws=True, matrix=True)
primaryUp = OpenMaya.MVector(*meshMatrix[4:7])
# have a secondary up vector for faces that are facing the same way as the original up
secondaryUp = OpenMaya.MVector(*meshMatrix[8:11])

sel = OpenMaya.MSelectionList()
sel.add(meshShape)

meshObj = OpenMaya.MObject()
sel.getDependNode(0, meshObj)

meshPolyIt = OpenMaya.MItMeshPolygon(meshObj)
faceNeighbors = []
faceCoordinates = []

while not meshPolyIt.isDone():

    normal = OpenMaya.MVector()
    meshPolyIt.getNormal(normal)

    # use the seconary up if the normal is facing the same direction as the object Y
    up = primaryUp if (1 - abs(primaryUp * normal)) > 0.001 else secondaryUp

    center = meshPolyIt.center()

    faceArray = OpenMaya.MIntArray()
    meshPolyIt.getConnectedFaces(faceArray)

    meshPolyIt.next()

    faceNeighbors.append([faceArray[i] for i in range(faceArray.length())])

    xAxis = up ^ normal
    yAxis = normal ^ xAxis

    matrixList = [xAxis.x, xAxis.y, xAxis.z, 0,
                  yAxis.x, yAxis.y, yAxis.z, 0,
                  normal.x, normal.y, normal.z, 0,
                  center.x, center.y, center.z, 1]

    faceMatrix = OpenMaya.MMatrix()
    OpenMaya.MScriptUtil.createMatrixFromList(matrixList, faceMatrix)

    faceCoordinates.append(faceMatrix)

这些函数将查找并返回哪个面位于相对于该面特定方向(X和Y)的给定面旁边。它使用点积来查看哪个面更倾向于那个特定的方向。这应该适用于任何数量的面,但它只返回一个面,该面位于该方向的大部分。在

^{pr2}$

所以你可以这样称呼它:

getUpFace(123) 

数字是脸部索引,你想从中得到“向上”的脸。在

试试这个,看看它是否满足你的需要。在

最简单的方法是在网格面上使用Pymel的connectedFaces():

http://download.autodesk.com/us/maya/2011help/pymel/generated/classes/pymel.core.general/pymel.core.general.MeshFace.html

import pymel.core as pm

sel = pm.ls(sl=True)[0]
pm.select(sel.connectedFaces())

相关问题 更多 >

    热门问题