
import maya.OpenMaya as om
from math import *
import maya.cmds as cmds
def wi(v,vi,tris):
#calculates the weights
#v = kernal of the starshaped polyhedron. this is the point that
# will be deformed
#vi = the current vert we are iterating over on the bounding polyhedron
#tris = all triangle facets on the polyhedron that vi is a member of
def A(vr,vs):
#get an angle
vec1 = vr-v
vec2 = vs-v
return vec1.angle(vec2)
def N(vr, vs):
#get the normal
vecr = vr-v
vecs = vs-v
norm = vecr^vecs
norm.normalize()
return norm
def ut(i,j,k):
#floater's equation for ut
top = A(j,k) + A(i,j)*( N(i, j)*N(j, k) ) + A(k,i)*(N(k, i)*N(j, k))
bot = 2*( (v-i)*N(j,k) )
return top/bot
ri = v.distanceTo(vi)
#pass all the triangles through floaters equation and sum up the results
ut_sum = 0
for t in tris:
ut_sum += ut(t[0], t[1], t[2])
return ut_sum/ri
class MVC():
def __init__(self):
#this is our main vert, the one that will be deformed
self.v = u.pnt("v")
self.bary = self.get_bary()
def update(self):
v = self.v
#refresh the list p with the current location of the locators in maya
p = [u.pnt("v0"), u.pnt("v1"), u.pnt("v2"), u.pnt("v3")]
x,y,z = 0,0,0
for i in range(len(p)):
x += p[i].x*self.bary[i]
y += p[i].y*self.bary[i]
z += p[i].z*self.bary[i]
#place a new locator at the deformed position
u.loc(om.MPoint(x, y, z))
def get_bary(self):
#get the barycentric weights
v = self.v
#get 4 points from maya that represent a polygon
p = [u.pnt("v0"), u.pnt("v1"), u.pnt("v2"), u.pnt("v3")]
#create a list of verts and all triangles that that vert
# is a memeber of
#the triangels are i,j,k, going counter clock wise, and
# i = the associated vert that will be iterated over
vert_tri=[
[p[0], [(p[0], p[1], p[2]), (p[0], p[3], p[1]), (p[0], p[2], p[3]),]],
[p[1], [(p[1], p[2], p[0]), (p[1], p[3], p[2]), (p[1], p[0], p[3]),]],
[p[2], [(p[2], p[0], p[1]), (p[2], p[1], p[3]), (p[2], p[3], p[0]),]],
[p[3], [(p[3], p[2], p[1]), (p[3], p[1], p[0]), (p[3], p[0], p[2]),]],
]
#verify in maya that all triangles are counter clockwise,
# normal outward, and begin with the same vert,
# the one that will be iterated over
verify_triangles(vert_tri)
#get the weight
weights = []
for vt in new_vert_tri:
t= list(vt[1])
t.reverse()
weights.append(wi(v, vt[0], t))
#get the bary weights
bary_weights=[]
weights_sum = sum(weights)
for w in weights:
bary_weights.append(w/weights_sum)
return bary_weights