﻿ lineManipContainer/manipulatorMath.cpp

# lineManipContainer/manipulatorMath.cpp

lineManipContainer/manipulatorMath.cpp
//-
// ==========================================================================
//
// Use of this software is subject to the terms of the Autodesk
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================
//+
#include <maya/MPoint.h>
#include <maya/MVector.h>
#include "manipulatorMath.h"
//
// Utility classes + functions
//
//
// planeMath
//
planeMath::planeMath()
{
a = b = c = d = 0.0;
}
bool planeMath::setPlane( const MPoint& pointOnPlane, const MVector& normalToPlane )
{
MVector _normalToPlane = normalToPlane;
_normalToPlane.normalize();
// Calculate a,b,c,d based on input
a = _normalToPlane.x;
b = _normalToPlane.y;
c = _normalToPlane.z;
d = -(a*pointOnPlane.x + b*pointOnPlane.y + c*pointOnPlane.z);
return true;
}
bool planeMath::intersect( const MPoint& linePoint, const MVector& lineDirection, MPoint& intersectionPoint )
{
double denominator = a*lineDirection.x + b*lineDirection.y + c*lineDirection.z;
// Verify that the vector and the plane are not parallel.
if(denominator < .00001)
{
return false;
}
double t = -(d + a*linePoint.x + b*linePoint.y + c*linePoint.z) / denominator;
// Calculate the intersection point.
intersectionPoint = linePoint + t * lineDirection;
return true;
}
//
// lineMath
//
lineMath::lineMath()
{
// No-op
}
bool lineMath::setLine( const MPoint& linePoint, const MVector& lineDirection )
{
point = linePoint;
direction = lineDirection;
direction.normalize();
return true;
}
bool lineMath::closestPoint( const MPoint& toPoint, MPoint& closest )
{
double t = direction * ( toPoint - point );
closest = point + ( direction * t );
return true;
}
//
// Utility class
//