Вероятно, вам будет проще это делать с ограничениями анимации, чем с математикой.Вы бы указали-ограничили свет для обоих локаторов с одинаковым весом - это поместит его на полпути между ними.Затем прицельтесь, ограничьте его так, чтобы он указывал на одного из них с миром вверх в качестве «бокового вектора» и смещением вращения, чтобы свет не переворачивался (это свет области, да?)
def area_light_between(target1, target2):
lightShape = cmds.createNode('areaLight')
lightXform = cmds.listRelatives(lightShape, p=True)
#You can get the distance manually without creating a distance dimension:
start = cmds.xform(target1, q=True, t=True)
end = cmds.xform(target2, q=True, t=True)
difference = [end[k] - start[k] for k in range(3)]
distance = math.sqrt(difference[0]**2 + difference[1]**2 + difference[2]**2)
cmds.xform(lightXform, s = (distance / 2.0, 0.1, 1))
# constrain the light between the targets
# use the mo=False flag so you don't keep the offset
cmds.pointConstraint(target1, target2,lightXform, mo = False)
# add the aim constraint (your world-up vector may vary)
cmds.aimConstraint(target2, lightXform, worldUpVector = (0,0,1), aimVector=(1,0,0), upVector = (0,0,1), mo = False)
return lightXform
area_light_between('pSphere1', 'pSphere2')
Myсцена - Z-Up, поэтому я должен указать вектор увеличения (0,0,1) - если вы используете Y-up vanilla Maya, ваш worldUpVector будет (0,1,0).Как и в любой ситуации ограничения цели, вы получите переворот, если вектор цели окажется слишком близко к вектору вверх - вам придется справиться с этим, если вы сделаете это таким образом или с чистой математикой.
Один хорошийПреимущество этого состоит в том, что вы можете редактировать ограничения после факта, чтобы сместить позицию или цель, сохраняя при этом общие отношения.