python + maya:将Y轴旋转为向量

时间:2014-04-07 22:24:46

标签: python vector maya

如何旋转圆形,使y轴沿着提供的矢量旋转?此示例脚本中的向量是使用场景中的两个定位器创建的。代码分为3个部分。第一部分只是创建测试场景。第二部分收集向量。第三部分是我需要帮助的地方,找出如何使用矢量来调整圆的旋转,使其Y轴指向收集的矢量。谢谢你们。

import maya.cmds as cmds
import random
import math

cmds.select(all=True)   
cmds.delete()

#------------------------------TEST SCENE SETUP

def genPos():
    x = random.uniform(-5,5)
    y = random.uniform(0,5)
    z = random.uniform(-5,5)
    return (x, y, z)

a = cmds.spaceLocator(n='ctrl_00')
b = cmds.spaceLocator(n='ctrl_00')

cmds.xform(a, t=(genPos()) )
cmds.xform(b, t=(genPos()) )

cmds.createDisplayLayer(name="Ctrls")
cmds.editDisplayLayerMembers('Ctrls', a, b)
cmds.setAttr('Ctrls.color' ,14)

cmds.select(clear=True)


#-----------------------THE SCRIPT
def normlizedVector(vecA,vecB,offset):

    nX = vecB[0] - vecA[0]
    nY = vecB[1] - vecA[1]
    nZ = vecB[2] - vecA[2]

    #vectorLength = distance vecA vecB
    # find the distance between the two supplied point3 values
    distX = pow( (vecA[0] - vecB[0] ) , 2.0 ) 
    distY = pow( (vecA[1] - vecB[1] ) , 2.0 ) 
    distZ = pow( (vecA[2] - vecB[2] ) , 2.0 )

    vecLength = math.sqrt(distX + distY + distZ)

    # the normalized vector is calculated by dividing the X, Y and Z coordinates by the length
    calcX = nX / vecLength
    calcY = nY / vecLength
    calcZ = nZ / vecLength

    # project point along vector, offset by a given value
    ptX = vecB[0] + (calcX * offset)
    ptY = vecB[1] + (calcY * offset)
    ptZ = vecB[2] + (calcZ * offset)

    return (ptX, ptY, ptZ)


posA = cmds.xform(a,q=1,ws=1,rp=1)  
posB = cmds.xform(b,q=1,ws=1,rp=1)  

pt = normlizedVector(posA,posB,10)

#--------MOVE AND ALIGN CIRCLE
cir = cmds.circle( nr=(0, 0, 1), c=(0, 0, 0) )
cmds.xform(cir, t=posB )

1 个答案:

答案 0 :(得分:2)

使用像Maya这样的软件包的强大之处在于,您不需要自己完成所有这些工作。你可以做到这一点,但它比使用Maya更慢,效率更低。事实上,如果你坚持这样做,你应该考虑完全处置Maya,因为它只是你不再需要的额外成本中心。

现在maya为此提供了工具。在这种情况下,显而易见的工具是如果您构建钻机的约束。调用现有工具没有错。你一直用函数做它,为什么不用maya节点它们毕竟是函数。最明显的是直接在您希望正常指向的位置创建圆,nr选项就是为此目的。但看起来你想要一些实际的操纵:

#aim 00 to 01 swap if you need the other way around
cmds.aimConstraint("ctrl_01", "ctrl_00", 
                   aimVector=(0, 1, 0), upVector=(0, 0, 1), 
                   worldUpType="vector", worldUpVector=(0, 1, 0));

就是这样。但是,您应该想要在代码中重现这一点或修改解决方案,因为这不是一个无问题的方法。目标节点所做的是它从3个向量手动构建矩阵,但是有一些无限的方法可以以不同的方式做到这一点。在这种情况下,如果您的目标向量指向上向量方向,那么极向量就会出现问题。

现在矩阵只是指向基数方向的一堆向量是微不足道的。 Maya在向量中存储矩阵是行格式,因此矩阵沿着向量指向y,其中a被归一化为单位长度,a看起来如下:

?   ?   ?   ?
a.x a.y a.z a.w=0 
?   ?   ?   ? 
0   0   0   1

现在要解决此问题,您需要标记向量的问题的任何正交值。输入向量,在这种情况下,采取与本地向上方向的交叉产品。并将其值放在x列中(向上矢量用作未知向上矢量的占位符),让我们调用此b并得到:

b.x b.y b.z b.w=0
a.x a.y a.z a.w=0 
?   ?   ?   ? 
0   0   0   1

现在你可以重新计算向上向量,因为它必须与a和b正交,所以越过b表示c,你得到:

b.x b.y b.z b.w=0
a.x a.y a.z a.w=0 
c.x c.y c.z c.w=0 
0   0   0   1

您可以分解此矩阵以获得欧拉角。您可以使用此主题的变体,通过添加到a获取起搏器参考,例如