Search code examples
mathvectormayapymel

Converting 2 point coords to vector coords for angleBetween()?


I'm working on a PyMEL script that allows the user to duplicate a selected object multiple times, using a CV curve and its points coordinates to transform & rotate each copy to a certain point in space. In order to achieve this, Im using the adjacent 2 points of each CV (control vertex) to determine the rotation for the object.

I have managed to retrieve the coordinates of the curve's CVs

#Add all points of the curve to the cvDict dictionary
int=0
cvDict={}
while int<selSize:
    pointName='point%s' % int
    coords= pointPosition ('%s.cv[%s]' % (obj,int), w=1)

    #Setup the key for the current point
    cvDict[pointName]={}

    #add coords to x,y,z subkeys to dict
    cvDict[pointName]['x']= coords[0]
    cvDict[pointName]['y']= coords[1]
    cvDict[pointName]['z']= coords[2]

    int += 1

Now the problem I'm having is figuring out how to get the angle for each CV. I stumbled upon the angleBetween() function:

http://download.autodesk.com/us/maya/2010help/CommandsPython/angleBetween.html

In theory, this should be my solution, since I could find the "middle vector" (not sure if that's the mathematical term) of each of the curve's CVs (using the adjacent CVs' coordinates to find a fourth point) and use the above mentioned function to determine how much I'd have to rotate the object using a reference vector, for example on the z axis.

At least theoretically - the issue is that the function only takes 1 set of coords for each vector and I have absolutely no Idea how to convert my point coords to that format (since I always have at least 2 sets of coordinates, one for each point).

Thanks.


Solution

  • If you wanna go the long way and not grab the world transforms of the curve, definitely make use of pymel's datatypes module. It has everything that python's native math module does and a few others that are Maya specific. Also the math you would require to do this based on CVs can be found here.

    Hope that puts you in the right direction.