- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到一个问题,我需要选择一张预选面孔旁边的面孔。
这可能很容易完成,但问题是当我得到邻居的脸时,我需要知道它面向哪个方向。
所以现在我可以选择与边缘连接的面,但我无法获取第一个选定面的左侧或右侧的面。我尝试了多种方法但找不到解决方案。
我尝试过:
pickWalk - cmds.pickWalk()
- 问题在于它的行为无法预测,因为它从相机角度遍历网格.
polyInfo - cmds.polyInfo()
- 这是一个非常有用的函数,最接近答案。在这种方法中,我尝试从面部提取边缘,然后使用edgeToFace()查看哪些是该面部的邻居。这很好用,但不能解决我的问题。详细地说,当 polyInfo
返回共享边缘的面时,它不会以我始终可以知道 edgesList[0]
(例如)是指向左或右的边缘。因此,如果我在不同的面上使用它,则在每种情况下生成的面可能面向不同的方向。
困难的方法,从顶点到边,再到面等进行多次转换。但是,这仍然是同样的问题,我不知道哪条边是顶部或左侧。
conectedFaces()
我在选定的面上调用的方法,它返回连接到第一个面的面,但仍然是同样的问题,我不知道哪个面朝哪个面走哪条路。
需要明确的是,我没有使用预先选择的面孔列表并检查它们,但我需要在不知道或将其名字保存在某处的情况下了解这些面孔。有人知道一种选择面孔的方法吗?
为了详细说明我的问题,我制作了一张图片以使其清楚:
正如您从示例中看到的,如果有选定的面,我需要选择任何尖角面,但这必须是我想要选择的确切面。其他方法选择所有相邻面,但我需要可以说“选择右侧”并从第一个选定面中选择右侧面的方法。
最佳答案
这是一种在上/下/左/右与网格变换(局部空间)对齐的规则下相当一致的解决方案,尽管也可能是世界空间。
我要做的第一件事是使用网格变换的平均面顶点位置、面法线和世界空间 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)上给定的面旁边的面。它使用点积来查看哪个面更靠近该特定方向。这应该适用于任意数量的面,但它只会返回最靠近该方向的一个面。
def getUpFace(faceIndex):
return getDirectionalFace(faceIndex, OpenMaya.MVector(0,1,0))
def getDownFace(faceIndex):
return getDirectionalFace(faceIndex, OpenMaya.MVector(0,-1,0))
def getRightFace(faceIndex):
return getDirectionalFace(faceIndex, OpenMaya.MVector(1,0,0))
def getLeftFace(faceIndex):
return getDirectionalFace(faceIndex, OpenMaya.MVector(-1,0,0))
def getDirectionalFace(faceIndex, axis):
faceMatrix = faceCoordinates[faceIndex]
closestDotProd = -1.0
nextFace = -1
for n in faceNeighbors[faceIndex]:
nMatrix = faceCoordinates[n] * faceMatrix.inverse()
nVector = OpenMaya.MVector(nMatrix(3,0), nMatrix(3,1), nMatrix(3,2))
dp = nVector * axis
if dp > closestDotProd:
closestDotProd = dp
nextFace = n
return nextFace
所以你可以这样调用它:
getUpFace(123)
将数字作为面索引,您希望从中获取“向上”的面。
尝试一下,看看它是否满足您的需求。
关于python - 如何在 Maya 中找到面邻居?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422082/
我从 SpatialPolygonsDataFrame 开始,它包含用于创建加纳各地区 map 的数据(可在 http://www.diva-gis.org/datadown 获取)。我正在尝试创建一
我遇到了一个问题,我需要根据存储在前一个元素中的信息修改容器的元素。示例: 如果前一个 vector 元素可被 2 整除,则将当前元素乘以 10 vector -> [12, 11, 33, 10]
总的来说,我对脚本编写还很陌生。我正在编写一个 expect 脚本,它通过 ssh 进入 Cisco 交换机,并运行“show cdp neighbors”命令来获取连接到交换机的所有设备的列表。然后
我正在尝试比较节点的值。使用 flood-fill 算法,我能够垂直和水平检查网格的每个节点。现在我必须更新我的代码以检查位于对 Angular 线上的单元格,如下图所示: 红色是当前节点,黄色是需要
我使用预先计算的指标使用 Scikit-Learn 的最近邻/半径分类。这意味着,我将成对距离的 n_samples_train x n_samples_train 矩阵传递给分类器的拟合方法。 现在
我有一个大的稀疏图,我将其表示为邻接矩阵(100k x 100k 或更大),存储为边数组。具有(非稀疏)4 x 4 矩阵的示例: 0 7 4 0 example_array = [ [7,1,2],
从有向图中并给出两个顶点 (v, u) 我需要找到:共同的“出”邻居和共同的“入”邻居。 例如: import networkx as nx ghybrid = nx.DiGraph() ghybri
我正在使用 JavaScript 进行图像处理,我想知道是否有任何通用公式可以确定像素的 x 邻居。 我知道对于 3*3 的正方形,可以使用特定的 x 和 y 像素确定 8 个邻居。 (x-1,y-1
在 CentOS 6.4(内核 2.6.32)上,为什么下面的第二个 arping 调用会创建一个新的 ARP 表条目,而第一个不会?网络行为是相同的,我感到困惑的是,在我看来,系统调用实际上是等同的
我是一名优秀的程序员,十分优秀!