Removed by popular demand

removed by popular demand

removed by popular demand

1 Like

removed by popular demand

1 Like

removed by popular demand

removed by popular demand

removed by popular demand

removed by popular demand

removed by popular demand

removed by popular demand

removed by popular demand

you can convert quicktime to gif online.

Removed by popular demand.

removed by popular demand

removed by popular demand

maybe she is startled by what she is seeing.

could you make scene of her lay on a bed?

removed by popular demand

removed by popular demand

removed by popular demand

Here’s a quick n’ dirty script for mirroring shapekeys- You have to select the original, un-shapekey’d object (NO shapekeys applied, must be symmetrical), and then run the script, right now the script symmetrizes every object named “dupe” based on the symmetry of the selected (original) object. Feel free to change that, when I add this to my rigging addon in the future I’m probably gonna have it work for all selected objects to be symmetrized based on the active object. (That’s every object with “dupe” in the name, dupe is short for duplicate.)
The original object should have a vertex group called “check” which will limit the area of the search, otherwise the script will take a really, really long time.

import bpy
import bmesh

from mathutils import Vector

def CoincidentPoints(p1, p2, tolerance = 0.01):
    if (tolerance == 0):
        return (p1 == p2)
    #a function to check if two points are coincident, with threshold
    #From https://stackoverflow.com/questions/41270792/check-for-coincident-points-within-tolerance#41270863
    # thanks kmaork, Rockcat
    same = lambda p1, p2, tol: sum((p2[i] - p1[i])**2 for i in range(len(p1))) <= tol**2
    return same(p1, p2, tolerance)





obOrig = bpy.context.active_object
bm = bmesh.new()
bm.from_object(obOrig, bpy.context.view_layer.depsgraph)
vg = obOrig.vertex_groups["check"]

#get the pairs of symmetrical vertices:
vertPairs = []
vertDone = set()
for v in bm.verts:
    if (v.index in vertDone):
        continue
    if (v.co[0] <= 0):
        continue
    try:
        weight = vg.weight(v.index)
        if (weight == 0):
            continue
        vertDone.add(v.index)
        mirrorCo = Vector((v.co[0] * -1, v.co[1], v.co[2]))
        for vCheck in bm.verts:
            if (vCheck.index in vertDone):
                continue
            if (vCheck.co[0] > 0):
                continue
            if (CoincidentPoints(mirrorCo, vCheck.co, 0.0001)):
                vertPairs.append( {v.index, vCheck.index} )
                vertDone.add(vCheck.index)
                break
    except RuntimeError:
        vertDone.add(v.index)
        continue

print (vertDone)
print (vertPairs)
print (len(vertPairs))


#obNew = bpy.data.objects["dupe"]

#bpy.context.view_layer.objects.active = obNew
#bpy.ops.object.convert(target='MESH')

#now apply the shape keys

#bm = bmesh.new()
#bm.from_object(obNew, bpy.context.view_layer.depsgraph)

obs = [ob for ob in bpy.data.objects if "dupe" in ob.name]



for ob in obs:
    bm = bmesh.new()
    bm.from_object(ob, bpy.context.view_layer.depsgraph)
    bm.verts.ensure_lookup_table()
    for (v1, v2) in vertPairs:
        print (v1, v2)
        co1 = bm.verts[v1].co.copy()
        co2 = bm.verts[v2].co.copy()
        if (co1[0] > 0 and co2[0] > 0):
            raise RuntimeError
        elif (co1[0] < 0 and co2[0] < 0):
            raise RuntimeError
            
        if (co1[0] > 0):
            mirrorCo = Vector((co1[0] * -1, co1[1], co1[2]))
            bm.verts[v2].co = mirrorCo.copy()
        else:
            mirrorCo = Vector((co2[0] * -1, co2[1], co2[2]))
            bm.verts[v1].co = mirrorCo.copy()
    bm.to_mesh(ob.data)