And again I've made some progress. Or at least got some type of lookAt 
algorithm working. 
Still not sure on how to actually use this for calculating the twist around the 
curve. 
I'm not so sure about the used algorithm (just searched around on the internet 
and rewrote it for Maya) since I'm not really understanding how it works, got 
to look into Quaternions some more before I understand what's going on here.

Here's the code:
Testing on a scene with object's names ("pCube1", "pCube2", "pSphere1")

########

import maya.cmds as mc
import maya.OpenMaya as om
from math import sqrt

def getDependNodeByName( name ):
    selList = om.MSelectionList ()
    selList.add (name)
    node = om.MObject()
    selList.getDependNode (0, node)
    return node

        
def gsOrthonormalize( normal, tangent ):
    # Gram-Schmidt Orthonormalization
    normal.normalize()
    proj = normal * ( tangent * normal ) # normal * dotProduct(tangent,normal)
    tangent = tangent - proj
    tangent.normalize()
    
    return normal, tangent
        
def lookAt( lookDirection=om.MVector(0,0,0), upDirection=om.MVector(0,0,0) ):
    # Returns a quaternion that aims the Y-axes to lookDirection and Z-axes 
(orthogonal to Y) to upDirection
    
    forward = lookDirection
    up = upDirection
    up, forward = gsOrthonormalize(forward, up)
    right = lookDirection ^ upDirection # cross product
    right.normalize()
    
    quat = om.MQuaternion() 
    quat.w = sqrt(1.0 + right.x + up.y + forward.z ) * 0.5
    w4_recip = 1.0 / (4.0 * quat.w)
    quat.x = (up.z - forward.y) * w4_recip
    quat.y = (forward.x - right.z) * w4_recip
    quat.z = (right.y - up.x) * w4_recip
    return quat
    
def getTranslationByTransformName( name ):
    node = getDependNodeByName( name )
    fnTransform = om.MFnTransform( node )
    transformMatrix = fnTransform.transformation()
    return transformMatrix.getTranslation(om.MSpace.kWorld)
    
def aimObject( object, aimToObject, aimUpObject ):
    srcTranslate = getTranslationByTransformName(object)
    targetTranslate = getTranslationByTransformName(aimToObject)
    upTranslate = getTranslationByTransformName(aimUpObject)
    
    aimVec = targetTranslate - srcTranslate
    upVec = upTranslate - srcTranslate
    quat = lookAt( aimVec, upVec )
    
    srcNode = getDependNodeByName(object)
    fnTransform = om.MFnTransform(srcNode)
    srcTransformMatrix = fnTransform.transformation()
    srcTransformMatrix.setRotationQuaternion( quat.x, quat.y, quat.z, quat.w, 
om.MSpace().kTransform )
    
    # Set the adjusted matrix
    fnTransform.set(srcTransformMatrix)
    mc.refresh()

aimObject("pSphere1","pCube1","pCube2")

#########

Looking forward to any tips from you guys on this guy. It's all giving me a 
headache.

-Roy

From: roy_niete...@hotmail.com
To: python_inside_maya@googlegroups.com
Subject: RE: [Maya-Python] API: Custom Spline IK (or Motion Path)
Date: Tue, 13 Nov 2012 20:17:41 +0100




So I've been trying hard to understand how to perform the 'lookAt' stuff with 
the API, which I think is the basics of what I need to understand to achieve 
what I want.
This is what I got so far. Use it in a scene with a sphere and two cubes with 
their default names. ;)

###########

import maya.cmds as mc
import maya.OpenMaya as om

def getDependNodeByName( name ):
    selList = om.MSelectionList ()
    selList.add (name)
    node = om.MObject()
    selList.getDependNode (0, node)
    return node

srcNode = getDependNodeByName("pSphere1")
targetNode = getDependNodeByName("pCube1")
upNode = getDependNodeByName("pCube2")

fnSrc = om.MFnTransform(srcNode)
fnTarget = om.MFnTransform(targetNode)
fnUp = om.MFnTransform(upNode)

srcTransformMatrix = fnSrc.transformation()
srcTranslate = srcTransformMatrix.getTranslation(om.MSpace.kWorld)
srcQuatRotation = srcTransformMatrix.rotation()

targetTransformMatrix = fnTarget.transformation()
targetTranslate = targetTransformMatrix.getTranslation(om.MSpace.kWorld)

upTransformMatrix = fnUp.transformation()
upTranslate = upTransformMatrix.getTranslation(om.MSpace.kWorld)

# Aim Axis (hardcoded to x)
basisAimVec = om.MVector(0,0,0)
basisAimVec.x = 1
basisAimVec = basisAimVec.rotateBy(srcQuatRotation)

aimVec = targetTranslate - srcTranslate
quat = basisAimVec.rotateTo(aimVec)

srcTransformMatrix.addRotationQuaternion( quat.x, quat.y, quat.z, quat.w, 
om.MSpace().kTransform )
srcQuatRotation = srcTransformMatrix.rotation()

# Up Axis (hardcoded to y)
"""
basisUpVec = om.MVector(0,0,0)
basisUpVec.y = 1
basisUpVec = basisUpVec.rotateBy(srcQuatRotation)

upVec = upTranslate - srcTranslate
quat = basisUpVec.rotateTo(upVec)

srcTransformMatrix.addRotationQuaternion( quat.x, quat.y, quat.z, quat.w, 
om.MSpace().kTransform );
"""

# Set the adjusted matrix
fnSrc.set(srcTransformMatrix)
mc.refresh()

###########

So I haven't been able to implement the up axis in this. Any tips would be 
greatly appreciated.
I also had to refresh at the end otherwise Maya ended up not updating the 
viewport, anybody knows what that's all about?

Love to get into this more so thanks in advance for any help!

Regards,
Roy

From: jspatr...@gmail.com
Date: Mon, 12 Nov 2012 08:57:06 -0800
Subject: Re: [Maya-Python] API: Custom Spline IK (or Motion Path)
To: python_inside_maya@googlegroups.com

That was a lot of shorthand on my part.
For instance, lets say you're using some sort of 'target' object for the 
up-axis.  And let's say the aim-axis of the joint is y, and the up-axis is x.  
Pretend your joint is at position [0,3,0] and the 'target' object is at 
[1,4,1], so the aim vector is [1,1,1]. If your target is perfectly on-plane 
with your joint, ie it lies on the x-z plane of your joint, then you don't need 
any work; but usually, a target object might be 'offset' from this plane, as is 
the case here.  You need to remove the 'y' part of this vector so that you 
don't wobble the joint - so the aim vector becomes [1,0,1].



aimVec = OM.MVector(1,0,1)
basisVec = OM.MVector(1,0,0) #since the aim-axis is x
quat = basisVec.rotateTo(aimVec)
twistMatrix = quat.asMatrix()
newJointMatrix = aimMatrix * twistMatrix
There are other things you'll need to take into account - rotation orders, 
parent matrices, inverse scale compensation, etc, to get the final euler 
rotation values of each joint.  Hopefully this gets you pointed in the right 
direction.  Good luck!





 


On Mon, Nov 12, 2012 at 7:51 AM, Roy Nieterau <royniete...@gmail.com> wrote:


Hey John,

Thanks for the quick replies. I'm not sure what you mean with the following:



Zero out whichever axis is the aim-axis in your 'up vector', then 
convert that vector into an MMatrix.  Now you have a matrix you can 
multiply your existing aimed-joint-matrix by to twist it.
Why would that be helpful or what would those steps produce? If I zero out the 
up vector and convert that into an MMatrix ain't I creating a zero matrix? 
(Default matrix)



-Roy


On Monday, November 12, 2012 4:34:14 PM UTC+1, JP wrote:

I would think about it like this:  for each point/joint along the curve, you 
should have some sort of 'up vector'.  You could get that a number of ways - a 
start/end 'twist' amount, an array of 'up' target objects for each joint, etc.  
The end result is that each point along the curve should have a vector to some 
other target to help determine the twist.  




Next, you'll need to know what your joint's aim-axis is.  The built-in spline 
ik node assumes an 'x' aim axis (which blows), but you could have an input attr 
for the aim axis.




Zero out whichever axis is the aim-axis in your 'up vector', then convert that 
vector into an MMatrix.  Now you have a matrix you can multiply your existing 
aimed-joint-matrix by to twist it.




I think it would be nice to have an array of world matrices for up-objects, 
which you would plug the controls for the spline into.  You could get the 
closest point along the curve for each and treat a particular axis as the 'up 
vector' for that point along the curve, then interpolate between them.





On Mon, Nov 12, 2012 at 7:13 AM, Roy Nieterau <roy_ni...@hotmail.com> wrote:





Hey JP,

Actually I know how to get the point on the curve. Aiming at the next joint is 
also a relatively easy step.

On the other hand knowing/calculating the up vector for the aim is something 
I'm unaware of how to do it. How did you solve/calculate the up vector for the 
aim constraint?





I'm especially interested in allowing a twisting motion along the curve.

-Roy

CC: python_in...@googlegroups.com


From: jspa...@gmail.com
Subject: Re: [Maya-Python] API: Custom Spline IK (or Motion Path)
Date: Mon, 12 Nov 2012 07:08:48 -0800
To: python_in...@googlegroups.com



Hey Roy,
I've done a sort of 'manual' setup like this by writing a 'pointAtArclen' node 
and then wiring the rest with existing nodes.  In my case I used aim 
constraints for each joint, but you can do something similar within your 
solver- get the orientation by figuring out where each joint needs to be on the 
curve and what the vector would be if you were aiming each joint at the next.




-JP

Sent from my iPhone
On Nov 12, 2012, at 2:00 AM, Roy Nieterau <royni...@gmail.com> wrote:



Hey Guys,

I'm looking into creating a custom Stretchy Spline IK setup that doesn't pop 
(over & under extends in extreme situations). 
But I seem to be unable to wrap my head around how to calculate orientations on 
points on the curve. 




Since the points on the curve don't have any orientation (well, they do have 
tangents or something like that?) I have no clue on how to actually start with 
this.

My main references of tools in Maya would be the Motion Path and the Spline IK 
(with Advanced Twist controlled by a start and end object). 




If anybody has any starting points for this it would be greatly appreciated!

Thanks in advance.

Regards,
Roy





-- 

view archives: http://groups.google.com/group/python_inside_maya

change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe






-- 

view archives: http://groups.google.com/group/python_inside_maya

change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe


                                          







-- 

view archives: http://groups.google.com/group/python_inside_maya

change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe



-- 
John Patrick
404-242-2675


jspa...@gmail.com
http://www.canyourigit.com









-- 

view archives: http://groups.google.com/group/python_inside_maya

change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe



-- 
John Patrick
404-242-2675
jspatr...@gmail.com
http://www.canyourigit.com








-- 

view archives: http://groups.google.com/group/python_inside_maya

change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe
                                          




-- 

view archives: http://groups.google.com/group/python_inside_maya

change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe
                                          

-- 
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe

Reply via email to