我正在寻找一个好的代码示例,使用API计算maya中任意多边形上的重心坐标。我最近可以像这样计算三角形内的重心坐标:
def baryInterp(vecA, vecB, vecC, vecP):
'''
Calculates barycentricInterpolation of a point in a triangle.
:param vecA - OpenMaya.MVector of a vertex point.
:param vecB - OpenMaya.MVector of a vertex point.
:param vecC - OpenMaya.MVector of a vertex point.
:param vecP - OpenMaya.MVector of a point to be interpolated.
Returns list of 3 floats representing weight values per each point.
'''
v0 = vecB - vecA
v1 = vecC - vecA
v2 = vecP - vecA
d00 = v0 * v0
d01 = v0 * v1
d11 = v1 * v1
d20 = v2 * v0
d21 = v2 * v1
denom = d00 * d11 - d01 * d01
v = (d11 * d20 - d01 * d21) / denom
w = (d00 * d21 - d01 * d20) / denom
u = 1.0 - v - w
return [u, v, w]
我现在想知道如何使用代表多边形的任意数量的点来做到这一点。我不确定我是否只需要计算每个三角形和一些如何从中得到坐标。
任何帮助都将不胜感激。
答案 0 :(得分:0)
它可能必须是三角形,原因有两个:
凹凸:如果你有一个凹的n-gon,你必须测试每个坐标以确保它在里面。重心基本上是点之间距离的独特组合,对于凹形图,将有许多组合落在ngon的边界之外。
平面性:三角形总是平面的,因此重心坐标始终位于三角形上。对于ngons不适用。
然而,您可以对凸平面非线性进行重心坐标。可能更好的是对三角形进行三角测量并使用更简单,更稳健的三角形。
答案 1 :(得分:0)
我最终为此做的是实施this,它似乎与maya的复制皮肤重量相关。我确实检查了多边形是否是凸的,如果是,它只是在最近的三角形上使用常规的重心坐标。
感谢您的投入!