Любой правильный выбор очистит кеш (выделено), и в последующих проверках выполняются необходимые действия, связанные каждым индивидуальным выбором: Add/Replace scriptlink удалит скриптсвязь, если она уже присутствует, чтобы предотвратить появление дубликатов и, затем, добавит её к активному объекту. Затем будет представлено меню целей, чтобы выбрать Меш-объект для использования при создании отпечатка. Так как мы уже очистили кеш, то второй выбор, Clear cache, не делает ничего специфического, так что здесь у нас просто оператор
Если скрипт выполняется как скриптсвязь, мы сначала проверяем, что мы действуем при событии
elif Blender.event == 'FrameChanged':
try:
retrievemesh(Blender.link,Blender.Get('curframe'))
except Exception as e: # мы ловим что-нибудь
objects = gettargetobjects(Blender.link)
for ob in objects:
impress(Blender.link,ob)
storemesh(Blender.link,Blender.Get('curframe'))
Blender.link.makeDisplayList()
Теперь нам осталось фактическое вычисление отпечатка целевого объекта в нашем меше.
Определение эффекта создания отпечатка от целевого объекта будем достигать следующим образом:
Для каждой вершины в меше, получающем отпечаток:
1. Определить, расположена ли она внутри целевого объекта, и если это так:
2. Установить позицию вершины в позицию ближайшей вершины на объекте, создающем отпечаток
Здесь есть несколько важных вопросов. Позиция вершины в меше сохранена относительно матрицы преобразования объекта. Другими словами, если мы хотим сравнить координаты вершин в двух разных мешах, мы должны преобразовать каждую вершину матрицами преобразования их соответствующих объектов перед выполнением любого сравнения.
Также, объект
Наконец, перемещение вершин к ближайшей вершине на целевом объекте может быть совсем неточным, если целевой меш довольно грубый. Производительность разумная, тем не менее, было бы хорошо иметь для сравнения несколько точек, так как наш алгоритм - довольно неумелый, поскольку сначала определяет точку внутри меша, и затем отдельно вычисляет ближайшую вершину, дублируя множество вычислений. Тем не менее, так как производительность приемлема даже для мешей, состоящих из сотен точек, мы будем придерживаться нашего подхода, поскольку он сохраняет нашу программу простой и спасает нас от необходимости писать и тестировать очень сложный код.
Реализация начинается с функции, возвращающей расстояние до ближайшей вершины к данной точке pt и её координаты:
def closest(me,pt):
min = None
vm = None
for v in me.verts:
d=(v.co-pt).length
if min == None or d
min = d
vm = v.co
return min,vm