Skip to content

Instantly share code, notes, and snippets.

@jonntd
Created April 22, 2024 11:05
Show Gist options
  • Select an option

  • Save jonntd/cbc575d294e176499902251d120cbb29 to your computer and use it in GitHub Desktop.

Select an option

Save jonntd/cbc575d294e176499902251d120cbb29 to your computer and use it in GitHub Desktop.
def aim(vector, aimvec, upvec, worldUpVec):
vector = om.MVector(vector)
aimvec = om.MVector(aimvec)
upvec = om.MVector(upvec)
worldUpVec = om.MVector(worldUpVec)
tanvec = worldUpVec - vector
direction = tanvec ^ vector
aimQuat = om.MQuaternion(aimvec, vector)
fromvec = upvec.transformAsNormal(aimQuat.asMatrix())
vnormal = vector.normal()
projvec = tanvec - (vnormal * (vnormal * tanvec))
dot = fromvec * projvec
theta = math.acos(dot / (fromvec.length() * projvec.length()))
if fromvec * direction > 0:
angle = theta
else:
angle = ((2 * math.pi) - theta)
upQuat = om.MQuaternion(angle, aimvec)
aimMatrix = aimQuat.asMatrix()
upMatrix = upQuat.asMatrix()
tmx = om.MTransformationMatrix(upMatrix * aimMatrix)
r = tmx.rotation()
deg = math.degrees
return [deg(r.x), deg(r.y), deg(r.z)]
def ptToOrient(nodeA, nodeB, reverse=False):
pos1 = cmds.xform(nodeA, q=1, ws=1, t=1)
pos2 = cmds.xform(nodeB, q=1, ws=1, t=1)
mx_p = om.MMatrix()
for i in range(3):
mx_p.setElement(3, i, pos1[i])
mx_c = om.MMatrix()
for i in range(3):
mx_c.setElement(3, i, pos2[i])
cmx = mx_c * mx_p.inverse()
v = om.MVector(cmx[12], cmx[13], cmx[14])
if reverse:
v *= -1
return aim(vector=v, aimvec = [1,0,0], upvec = [0,1,0], worldUpVec = [0,1,0])
import maya.api.OpenMaya as om
def getVertexMatrix(mesh, vtx, pos):
sel = om.MSelectionList()
sel.add(mesh)
dagPath = sel.getDagPath(0)
mfnMesh = om.MFnMesh(dagPath)
space = om.MSpace.kObject
pt = om.MPoint(pos[0], pos[1], pos[2])
positon, normal, fid = mfnMesh.getClosestPointAndNormal(pt, space)
normal = mfnMesh.getVertexNormal(vtx, space)
tangent = mfnMesh.getFaceVertexTangent(fid, vtx, space)
binormal = mfnMesh.getFaceVertexBinormal(fid, vtx, space)
normal.normalize()
tangent.normalize()
binormal.normalize()
mm = [binormal.x, binormal.y, binormal.z, 0,
normal.x, normal.y, normal.z, 0,
tangent.x, tangent.y, tangent.z, 0,
pt.x, pt.y, pt.z, 1]
return om.MMatrix(mm)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment