Vertex Order?


(SidV) #1

I made a script that analyse a poly line and measures the distances between each vertex and save them in a list.
Then, takes a copy of that polyline that i converted into a curve, add a Follow_Path constraint and put empties for each vertex of that poly line.

In my tests it seemed to work. I made a Curve with at least 5 vertices, converted into a poly line and after running the script, each path empty was pretty much at the position of the analysed poly line vertices.

The problem is, when i convert a poly loop to a poly line from a character mesh (eyes or mouth for example) the script works but the empties dont match up with the vertex postion of that poly line anymore. I wonder if this has something to do with the vertex order.

Here is the script, probably awkwardly done since i’m a bloody python rook, no doubt. So, in order for it to work you need a poly line (named U.Lip) and a copy converted into a Curve (named U.Lip.Crv).

This script is based on an idea by Marco Giordano for Maya and can be found on Vimeo and probably explains it better what i am trying to do here.
https://vimeo.com/66583205
It would be awesome if somone could find the time to look into it and tell me why it wont work as expected.


import bpy

import os

os.system("cls")
bpy.context.scene.objects.active = bpy.data.objects['U.Lip']

def findlengthofcurve(obj):
    mesh = obj.data
    edges = mesh.edges.values()
    vertices = mesh.vertices.values()
    
    TotalSegLength = 0      #Total Length
    NumSeg = 0              #Total Number of Segments
    SegList =[]             #List of Segment Lengths
    
    for i in edges:
        print (vertices)
        vtx1, vtx2 = i.vertices
        segLength = (vertices[vtx1].co-vertices[vtx2].co).length
        
        TotalSegLength += segLength       
        SegList.append(TotalSegLength)   
        
        NumSeg+=1       
    return NumSeg,TotalSegLength,SegList    
  


list = findlengthofcurve(bpy.context.active_object)

print (list[2])         #List of Segment Lengths
print (list[1])         #Total Length
print (list[0])         #Total Number of Segments

# This part places an empty at the start of the path
bpy.context.scene.objects.active = bpy.data.objects['U.Lip.Crv']
name = 'Empty.00'
bpy.ops.object.empty_add(type='PLAIN_AXES', location=(0,0,0))
bpy.context.active_object.name = name
bpy.ops.object.constraint_add(type='FOLLOW_PATH')
bpy.data.objects['Empty.00'].constraints["Follow Path"].target = bpy.data.objects["U.Lip.Crv"]
bpy.data.objects['Empty.00'].constraints["Follow Path"].use_fixed_location = True
bpy.data.objects['Empty.00'].constraints["Follow Path"].offset_factor = 0.0
bpy.context.active_object.empty_draw_size = bpy.context.active_object.empty_draw_size / 50

#This part goes through the List of Segment Length and calculates the empty positions for the path
for x in range(list[0]):
    name = 'Empty.0{0}'.format(x+1)
    bpy.ops.object.empty_add(type='PLAIN_AXES', location=(0,0,0))
    bpy.context.active_object.name = name
    bpy.context.active_object.empty_draw_size = bpy.context.active_object.empty_draw_size / 50
    bpy.ops.object.constraint_add(type='FOLLOW_PATH')
    
    bpy.data.objects[name].constraints["Follow Path"].target = bpy.data.objects["U.Lip.Crv"]
    bpy.data.objects[name].constraints["Follow Path"].use_fixed_location = True

    ppos = ((list[2][x]*100)/(list[1])/100) #calculates the percentage position for the path
    print (ppos)
       
    bpy.data.objects[name].constraints["Follow Path"].offset_factor = ppos
    bpy.data.objects[name].constraints["Follow Path"].use_curve_follow = False