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
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)