NoCodeBandit & BoneArray
Привет, Бонарь, я знаю, ты часами доводишь иерархию костей до идеала. А что, если бы мы сделали простую, без кода, систему, которая бы автоматически назвала слои и присваивала вес костям? Чтобы ты мог сосредоточиться на геометрии, а не на этом кошмарном названии.
Прикольная идея, но автоматическое наименование не подойдет, если не будет соответствовать моей строгой системе. Автоматический вес – это просто насмешка, если он не будет таким же точным, как ручная прорисовка кривой. Если скрипт сможет доказать свою математику – подумаю.
Ладно, вот что нужно сделать: собери небольшой узел, который выдает таблицу весов костей для пары тестовых вершин, а потом нарисуй графики. Если кривая совпадает с кубической кривой Безье с твоими заранее определенными контрольными точками, математика должна сходиться. Как только таблица покажется нормальной, перенеси эту логику в свой автоматизатор – и у тебя будет скрипт точный, как нарисованная от руки кривая, и быстрый, как остроумная фраза. Попробуй и скажи, хорошо ли выглядят числа или нужна дополнительная математическая эквилибристика.
Конечно, сейчас скину тебе таблицу с весами вершин и построю графики. Если точки совпадут с моей формулой для кубических кривых Безье, математика будет выглядеть правильно. Как только график пройду проверкой, ты можешь перенести логику в свой автоматизатор. Если что-то покажется тебе не так, я укажу, где именно ошибка в интерполяции. Никаких ограничений, только чистая точность.
Звучит как отличный план. Просто кинь короткий кусочек кода на Python, который выдаст CSV с данными: костями, вершинами, весами. Потом загрузи его в Excel или сделай быстрый график в Matplotlib. Как только увидишь, как кривая повторяет твои контрольные точки Безье, скопируй функцию расчета весов в Automator. Если что-то покажется неправильным, дай знать, какая часть интерполяции сбивается – может, какой-нибудь скрытый нюанс. Удачи в кодинге.
Вот небольшой набросок кода.
Запусти его, проверь CSV-файл и график. Если кривые отклоняются, проблема либо в расчете кривой Безье, либо в нормализации весов. Функция `bezier` - это то, что тебе нужно будет скопировать в автоматизатор, когда все будет выглядеть хорошо.
Выглядит надёжно – запусти и смотри, как эта синяя кривая плавно пройдёт между твоими точками контроля. Если график совпадает с данными в CSV, можешь смело включать эту `bezier` функцию в автомато́р. Если что-то пойдёт не так, кидай мне координаты отклонения, подкорректируем формулы. Удачи с построением!
Вот финальный скрипт, чтобы просто добавить его в .py файл и запустить.
import csv
import math
import matplotlib.pyplot as plt
vertices = range(10)
bones = ['bone1', 'bone2']
ctrl = [(0,0.0),(0.3,0.7),(0.7,0.3),(1,0.0)]
def bezier(t,pts):
return (1-t)**3*pts[0][1] + 3*(1-t)**2*t*pts[1][1] + 3*(1-t)*t**2*pts[2][1] + t**3*pts[3][1]
with open('weights.csv','w',newline='') as f:
w = csv.writer(f)
w.writerow(['vertex','bone','weight'])
for v in vertices:
t = v/(len(vertices)-1)
w1 = bezier(t,ctrl)
w2 = 1-w1
w.writerow([v,'bone1',w1])
w.writerow([v,'bone2',w2])
t_vals = [v/(len(vertices)-1) for v in vertices]
w1_vals = [bezier(t,ctrl) for t in t_vals]
w2_vals = [1-w for w in w1_vals]
plt.plot(t_vals,w1_vals,'b-',label='bone1')
plt.plot(t_vals,w2_vals,'r-',label='bone2')
plt.legend()
plt.show()
Запусти его, проверь CSV и график. Если какая-то точка выбивается из линии, скажи, какая именно, и подправим математику.
Выглядит отлично – запускай. Возьми CSV-файл, проверь синюю кривую на графике. Если есть какие-то отклонения по весу, говори номер вершины, подкрутим формулу Безье. Удачи!