Возможно, вы могли бы сделать это исключительно с помощью математики, но, поскольку у Maya уже есть собственная структура для этого, мы можем просто использовать ограничения для достижения этого эффекта.
Идея состоит в том, что мы выбираем два объекта, которые ему нужны ограничиваясь, затем мы просто корректируем оба веса ограничений, так что сначала он идеально сочетается с первым объектом, затем на полпути это будет 50% от обоих, а затем, наконец, идеально смешивается с конечным объектом. 2-й вес всегда будет в точности противоположен 1-му весу, иначе он не будет смешиваться, как ожидалось.
Вот как мы можем go сделать это:
import maya.cmds as cmds
count = 20 # Amount of joints to create.
start = "locator1" # Change to object to start from.
end = "locator2" # Chagne to object to end to.
steps = 1.0 / (count - 1) # Will use count to calculate how much it should increase percentage by each iteration. Need to do -1 so the joints reach both start and end points.
perc = 0 # This will always go between a range of 0.0 - 1.0, and we'll use this in the constraint's weights.
for i in range(count):
jnt = cmds.createNode("joint") # Create a new joint.
cmds.setAttr(jnt + ".displayLocalAxis", True) # Display its orientation.
constraint = cmds.parentConstraint(start, jnt, weight=1.0 - perc)[0] # Apply 1st constraint, with inverse of current percentage.
cmds.parentConstraint(end, jnt, weight=perc) # Apply 2nd constraint, with current percentage as-is.
cmds.delete(constraint) # Don't need this anymore.
perc += steps # Increase percentage for next iteration.
Главное, чтобы perc
всегда находился в диапазоне от 0,0 до 1,0, поэтому веса всегда будут хорошо сочетаться, независимо от того, насколько вы отрегулируете количество создаваемых соединений. И так как мы используем cmds.parentConstraint
, он будет смешивать вращение тоже. Если вы не хотите этого, просто переключите его на cmds.pointConstraint
.
Вот пример с 6 суставами между 2 локаторами (оба локатора ориентированы по-разному, поэтому мы видим, как они смешиваются вдоль цепи):
И тот же пример с 20 соединениями:
О, один вещь, которую я забыл, это воспитание их всех вместе. Вы можете просто добавить новые соединения в список как go, а затем добавить его к последнему соединению в списке (за исключением первого, так как родительскому объекту не к чему)