I'm very new to blender but i thought these code snippets on making a blendshape/shapekey symmetric i wrote might be helpful.
cheers,
Nate
"""need imp to reload script
import sys
sys.path.append('/Users/Nathaniel/Documents/src_blender/python/naBlendShape')
import naMakeBlendshapeSymmetric as mod
import imp
imp.reload(mod)
mod.naMakeBlendshapeSymmetric(defaultMeshName = 'defaultFace', posedMeshName = 'posedFace', mirrorAxis = 1)
"""
import bpy
def naMakeBlendshapeSymmetric(defaultMeshName = '', posedMeshName = '', mirrorAxis = 1):
"""
this should be able to make both sides of blendshape/shape key symmetric on the posed mesh.
TODO: edit duplicate of posed mesh
mirrorAxis: 0 for x,1 for y,2 for z
"""
#todo validate input
###first figure out correspondence between source and destination
#ex {2: 0, 3: 1, 6: 4, 7: 5} says source vertex index 2's mirror index is 0 etc
blendshapeInfo = {}
defaultObj = bpy.data.objects[defaultMeshName]
for v in defaultObj.data.vertices:
#store key only if vertex world position in source side
sourcePosition = v.co
if sourcePosition[mirrorAxis] > 0: #0,1,2 : x,y,z
sourceVertex = v.index
#print('source vertex: '+str(sourceVertex))
print('source vertex: %d pos: %d %d %d' %(sourceVertex, sourcePosition[0], sourcePosition[1], sourcePosition[2]) )
#loop all vertices of mesh to find vertex on destination side
for v1 in defaultObj.data.vertices:
#if all positions same and negative value for destination side, its a mirror save it
xx = [0,1,2] #will hold all but source side index
xx.remove(mirrorAxis)
pos = v1.co
if pos[mirrorAxis] == -sourcePosition[mirrorAxis]:
if pos[xx[0]] == sourcePosition[xx[0]] and pos[xx[1]] == sourcePosition[xx[1]]:
#found a mirror, mirror side is negative source side and all other positions are same
destinationVertex = v1.index
print('destination vertex: %d pos: %d %d %d' %(destinationVertex, pos[0], pos[1], pos[2]) )
blendshapeInfo[sourceVertex] = destinationVertex
print("blendshapeInfo")
print(blendshapeInfo)
#########
###now actual do vertex movement
posedObj = bpy.data.objects[posedMeshName]
#assuming posedObj.data.vertices[i].index = i #not sure whether this is always true
for sourceVertexIndex in blendshapeInfo:
#we want to edit mirror side by making it the source position with one axis negated
sourcePosition = posedObj.data.vertices[sourceVertexIndex].co
m = [1,1,1]
m[mirrorAxis] = -1
mirrorPosition = [ sourcePosition[0]*m[0], sourcePosition[1]*m[1], sourcePosition[2]*m[2] ]
destinationVertexIndex = blendshapeInfo[sourceVertexIndex]
#actually move mirror side
posedObj.data.vertices[destinationVertexIndex].co = mirrorPosition
#########

