如何旋转圆形,使其y轴与所提供的矢量一致?此示例脚本中的矢量是使用场景中的两个定位器创建的。代码分为3个部分。第一部分只是创建测试场景。第二部分收集矢量。第三部分是我需要帮助确定如何使用矢量来调整圆的旋转,因此它的Y轴指向收集的矢量。感谢你们。python + maya:将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)
得到的比赛速度。我更喜欢使用约束而不是在代码中重新创造硬数学。在你的情况下,目标限制是一种选择吗? – mhlester
如果我去那条路线。我将制作一个虚拟定位器并使用约束对齐它,并避免与实际的圆形相混淆。然后将圆的变换对齐到哑元。如果那样的话,是否有一种快速和肮脏的方法来将一个节点与另一个变换明智地对齐? – JokerMartini
@mhlester它不算数学,事实上很琐碎。无论如何,请不要自行默认向量函数。让他们形成一些包,它只是一个非常不恰当的错误来源。 – joojaa