玛雅| Python:将子 X 轴和 Z 轴旋转归零后如何获得父 X 和子 Y 旋转?

问题描述 投票:0回答:1

我正在尝试编写一个脚本,自动将一组 3 个指南/控件(随机放置在场景中)彼此“瞄准”[从开始到中间,从中间到结束]。这些参考线也相互关联(就像正常的手臂/腿一样)[开始 -> 中间 -> 结束]。

到目前为止,我一直在使用 Maya 的内置目标约束,效果很好。

但是,为了获得最佳结果,目标约束将所有 3 个旋转轴上的中间导向器瞄准末端导向器,这对于装备(使用 IK 链)而言并不总是理想的。

所以我的问题是如何找到相同的目标旋转,但将其分布在父级(起始指南)和子级(中间指南)之间,以便子级仅绕 Y 轴旋转?

为了演示,我添加了与不同轴相对应的平面。

Start / Mid / End guides aimed with aim constraint

在此图像中,开始/中间/结束指南通过 Maya 的目标约束相互瞄准。

我已经编写了脚本。也就是说,起始指南和中间指南在所有轴上都有旋转值。

Mid joint with X and Z-axis zero-ed out

为了进一步构建我现有的脚本(我计划将中间指南的 X 轴和 Z 轴旋转归零,并根据这个更改后的版本计算与第一张图像的差异。如果可以从目标版本中获得改变的旋转(图 1)。

Mid guide Y-axis rotation is calculated

此后,将计算(子)中间导轨的 Y 轴旋转,以旋转末端导轨以与图像 1 中的末端导轨对齐。

start guide x-axis is calculated

然后将计算(父)起始参考线的 X 轴旋转,以再次将参考线与图像 1 匹配。

Desired end result

基本上最终得到的参考线位于完全相同的位置,但旋转得比 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

使用它背后的想法是这样的: Tryout example 其中 1 指的是使用 Maya 的目标约束进行瞄准时辅助线的位置(解释中的图像 1)。 2 指的是相同的导轨,但中间导轨上的 X 和 Z 旋转轴为零 d(解释中的图像 2)。 A1、A2和A3的位置用于计算角度A。 位置 B1、B2 和 B3 用于计算角度 B。 然后从A中减去B就得到所需的角度C。 这适用于 2D 环境(即,如果指南几乎不旋转),但不适用于 3D 环境。 所以像这样的与 [X,Y,Z] 旋转一起工作的东西会很棒。

除此之外,我还尝试了其他几个脚本,但不记得是哪些脚本,并在互联网上查找可以帮助我的相关问题/答案,但没有找到有用的答案。

python rotation constraints axis maya
1个回答
0
投票

我首先查看无翻转膝盖的设置和脚本。 如果我没记错的话,这就是你所追求的行为? 如果做不到这一点,我会习惯使用向量、矩阵和三角函数。 值得注意的是:dot、cross、angle、angleBetw、rot、sin、cos、tan。 抱歉,一旦您开始为任意位置之间的任意关系编写轮换脚本,在我看来,就没有办法解决它。 祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.