我正在尝试编写一个脚本,自动将一组 3 个指南/控件(随机放置在场景中)彼此“瞄准”[从开始到中间,从中间到结束]。这些参考线也相互关联(就像正常的手臂/腿一样)[开始 -> 中间 -> 结束]。
到目前为止,我一直在使用 Maya 的内置目标约束,效果很好。
但是,为了获得最佳结果,目标约束将所有 3 个旋转轴上的中间导向器瞄准末端导向器,这对于装备(使用 IK 链)而言并不总是理想的。
所以我的问题是如何找到相同的目标旋转,但将其分布在父级(起始指南)和子级(中间指南)之间,以便子级仅绕 Y 轴旋转?
为了演示,我添加了与不同轴相对应的平面。
在此图像中,开始/中间/结束指南通过 Maya 的目标约束相互瞄准。
我已经编写了脚本。也就是说,起始指南和中间指南在所有轴上都有旋转值。
为了进一步构建我现有的脚本(我计划将中间指南的 X 轴和 Z 轴旋转归零,并根据这个更改后的版本计算与第一张图像的差异。如果可以从目标版本中获得改变的旋转(图 1)。
此后,将计算(子)中间导轨的 Y 轴旋转,以旋转末端导轨以与图像 1 中的末端导轨对齐。
然后将计算(父)起始参考线的 X 轴旋转,以再次将参考线与图像 1 匹配。
基本上最终得到的参考线位于完全相同的位置,但旋转得比 Maya 内置的目标约束干净得多。
我问这个问题的原因是因为我自己不太擅长数学,更不用说通过脚本而不是通过 Maya 计算 3D 空间中的旋转了。
希望这有点道理。
答案可能很简单,我只是让自己很难受,只是想知道是否有人有我忽略的想法或见解。
我尝试过的
我在“Dominic”给出的以下线程上使用了脚本 [https://stackoverflow.com/a/42390363/22477916](尽管已翻译为 python 以在 Maya 中使用)。
import math
def normaliseToInteriorAngle(angle):
if (angle < 0):
angle += (2*math.pi)
if (angle > math.pi):
angle = 2*math.pi - angle
return angle
def angle(startJnt, midJnt, endJnt):
p1 = cmds.xform(startJnt, q=True, t=True, ws=True)
center = cmds.xform(midJnt, q=True, t=True, ws=True)
p2 = cmds.xform(endJnt, q=True, t=True, ws=True)
P1 = [(p1[0] - center[0]), (p1[1] - center[1])]
P2 = [(p2[0] - center[0]), (p2[1] - center[1])]
angleToP1XY = math.atan2(P1[1], P1[0])
angleToP2XY = math.atan2(P2[1], P2[0])
return normaliseToInteriorAngle(angleToP2XY - angleToP1XY)
def toDegrees(radians):
deg = 360 * radians / (2 * math.pi)
return deg
angleA_XY = angle('GuideA1', 'GuideA2', 'GuideA3')
angleDegA_XY = toDegrees(angleA_XY)
angleB_XY = angle('GuideB1', 'GuideB2', 'GuideB3')
angleDegB_XY = toDegrees(angleB_XY)
angleAB = angleDegA_XY - angleDegB_XY
使用它背后的想法是这样的: 其中 1 指的是使用 Maya 的目标约束进行瞄准时辅助线的位置(解释中的图像 1)。 2 指的是相同的导轨,但中间导轨上的 X 和 Z 旋转轴为零 d(解释中的图像 2)。 A1、A2和A3的位置用于计算角度A。 位置 B1、B2 和 B3 用于计算角度 B。 然后从A中减去B就得到所需的角度C。 这适用于 2D 环境(即,如果指南几乎不旋转),但不适用于 3D 环境。 所以像这样的与 [X,Y,Z] 旋转一起工作的东西会很棒。
除此之外,我还尝试了其他几个脚本,但不记得是哪些脚本,并在互联网上查找可以帮助我的相关问题/答案,但没有找到有用的答案。
我首先查看无翻转膝盖的设置和脚本。 如果我没记错的话,这就是你所追求的行为? 如果做不到这一点,我会习惯使用向量、矩阵和三角函数。 值得注意的是:dot、cross、angle、angleBetw、rot、sin、cos、tan。 抱歉,一旦您开始为任意位置之间的任意关系编写轮换脚本,在我看来,就没有办法解决它。 祝你好运!