manipulatorMath.py

#-
# ==========================================================================
# Copyright (C) 1995 - 2006 Autodesk, Inc. and/or its licensors.  All 
# rights reserved.
#
# The coded instructions, statements, computer programs, and/or related 
# material (collectively the "Data") in these files contain unpublished 
# information proprietary to Autodesk, Inc. ("Autodesk") and/or its 
# licensors, which is protected by U.S. and Canadian federal copyright 
# law and by international treaties.
#
# The Data is provided for use exclusively by You. You have the right 
# to use, modify, and incorporate this Data into other products for 
# purposes authorized by the Autodesk software license agreement, 
# without fee.
#
# The copyright notices in the Software and this entire statement, 
# including the above license grant, this restriction and the 
# following disclaimer, must be included in all copies of the 
# Software, in whole or in part, and all derivative works of 
# the Software, unless such copies or derivative works are solely 
# in the form of machine-executable object code generated by a 
# source language processor.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. 
# AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED 
# WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF 
# NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 
# PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE, OR 
# TRADE PRACTICE. IN NO EVENT WILL AUTODESK AND/OR ITS LICENSORS 
# BE LIABLE FOR ANY LOST REVENUES, DATA, OR PROFITS, OR SPECIAL, 
# DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK 
# AND/OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY 
# OR PROBABILITY OF SUCH DAMAGES.
#
# ==========================================================================
#+

import maya.OpenMaya as OpenMaya

# 
# simple plane math class
#
class planeMath:
        a = None
        b = None
        c = None
        d = None

        def __init__(self):
                a = 0
                b = 0
                c = 0
                d = 0

        def setPlane(self,pointOnPlane,normalToPlane):
                _normalToPlane = normalToPlane
                _normalToPlane.normalize()

                # Calculate a,b,c,d based on input
                self.a = _normalToPlane.x
                self.b = _normalToPlane.y
                self.c = _normalToPlane.z
                self.d = -(self.a*pointOnPlane.x + self.b*pointOnPlane.y + self.c*pointOnPlane.z)

        def intersect(self,linePoint,lineDirection):
                intersectionPoint = OpenMaya.MPoint()
                denominator = self.a*lineDirection.x + self.b*lineDirection.y + self.c*lineDirection.z
                # Verify that the vector and the plane are not parallel.
                if denominator < .00001:
                        return (False,intersectionPoint)

                t = -(self.d + self.a*linePoint.x + self.b*linePoint.y + self.c*linePoint.z) / denominator

                # Calculate the intersection point.
                scaledLineDirection = OpenMaya.MVector(lineDirection.x*t,lineDirection.y*t,lineDirection.z*t)
                intersectionPoint = linePoint + scaledLineDirection

                return (True,intersectionPoint)


#
# simple line math class
#
class lineMath:

        point = None
        direction = None

        def setLine(self,linePoint,lineDirection):
                self.point = linePoint
                self.direction = lineDirection
                self.direction.normalize()
                        
        def closestPoint(self,toPoint):
                t = self.direction * ( toPoint - self.point )
                closest = self.point + ( self.direction * t )
                return (True,closest)
                

#
# simple degree radian converted
class degreeRadianConverter:
        M_PI = 3.14159265358979323846
        def degreesToRadians(self,degrees):
                return degrees * ( self.M_PI / 180.0 )
        def radiansToDegrees(self,radians):
                return radians * ( 180.0  / self.M_PI)

#
# utility function to return the
# value which has the max abs
# -10,3,4 returns -10
def maxOfAbsThree(a,b,c):
        aa = abs(a)
        ab = abs(b)
        ac = abs(c)
        if aa > ab and aa > ac:
                return a
        if ab > aa and ab > ac:
                return b
        return c

#
# tests for the math classes
#
def testModule():
        # degreeRadianConverter
        drc = degreeRadianConverter()
        r = drc.degreesToRadians( 45 )
        print r, " ", r*4

        d = drc.radiansToDegrees( drc.M_PI/4.0 )
        print d

        # lineMath
        lm = lineMath()
        point = OpenMaya.MPoint(0,1,0)
        direction = OpenMaya.MVector( 1,1,0)
        lm.setLine( point, direction )
        toPoint = OpenMaya.MPoint(3,0,0)
        (worked,closestPoint) = lm.closestPoint(toPoint)
        if worked:
                print "closest point to line: %g %g %g" % (closestPoint.x,closestPoint.y,closestPoint.z)
        else:
                print "Failed to find closest point to line"

#
# invoke test if  run from the 
# command line
#
if __name__ == "__main__":
        testModule()




Autodesk® Maya® 2009 © 1997-2008 Autodesk, Inc. All rights reserved. Generated with doxygen 1.5.6