Addd new computeLocalToWorld(NodePath) etc methods.
This commit is contained in:
parent
a202cfa4f3
commit
3df0401007
@ -19,6 +19,27 @@
|
||||
|
||||
namespace osg {
|
||||
|
||||
|
||||
|
||||
/** compute the matrix which transforms objects in local coords to world coords,
|
||||
* by accumulating the Transform local to world matrices along the specified node path.*/
|
||||
extern SG_EXPORT Matrix computeLocalToWorld(NodePath& nodePath);
|
||||
|
||||
/** compute the matrix which transforms objects in world coords to local coords,
|
||||
* by accumulating the Transform world to local matrices along the specified node path.*/
|
||||
extern SG_EXPORT Matrix computeWorldToLocal(NodePath& nodePath);
|
||||
|
||||
/** compute the matrix which transforms objects in local coords to world coords,
|
||||
* by accumulating the Transform local to world matrices along the specified node path
|
||||
* the supplied initialial camera modelview .*/
|
||||
extern SG_EXPORT Matrix computeLocalToEye(const Matrix& modelview, NodePath& nodePath);
|
||||
|
||||
/** compute the matrix which transforms objects in world coords to local coords,
|
||||
* by accumulating the Transform world to local matrices along the specified node path
|
||||
* the inverse of the supplied initialial camera modelview.*/
|
||||
extern SG_EXPORT Matrix computeEyeToLocal(const Matrix& modelview, NodePath& nodePath);
|
||||
|
||||
|
||||
/** A Transform is a group node for which all children are transformed by
|
||||
* a 4x4 matrix. It is often used for positioning objects within a scene,
|
||||
* producing trackball functionality or for animation.
|
||||
|
@ -14,6 +14,93 @@
|
||||
|
||||
using namespace osg;
|
||||
|
||||
class TransformVisitor : public NodeVisitor
|
||||
{
|
||||
public:
|
||||
|
||||
enum CoordMode
|
||||
{
|
||||
WORLD_TO_LOCAL,
|
||||
LOCAL_TO_WORLD
|
||||
};
|
||||
|
||||
|
||||
CoordMode _coordMode;
|
||||
Matrix& _matrix;
|
||||
|
||||
TransformVisitor(Matrix& matrix,CoordMode coordMode):
|
||||
NodeVisitor(),
|
||||
_coordMode(coordMode),
|
||||
_matrix(matrix)
|
||||
{}
|
||||
|
||||
virtual void apply(Transform& transform)
|
||||
{
|
||||
if (_coordMode==LOCAL_TO_WORLD)
|
||||
{
|
||||
transform.getLocalToWorldMatrix(_matrix,this);
|
||||
}
|
||||
else // worldToLocal
|
||||
{
|
||||
transform.getWorldToLocalMatrix(_matrix,this);
|
||||
}
|
||||
}
|
||||
|
||||
void accumulate(NodePath& nodePath)
|
||||
{
|
||||
for(NodePath::iterator itr=nodePath.begin();
|
||||
itr!=nodePath.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->accept(*this);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Matrix osg::computeLocalToWorld(NodePath& nodePath)
|
||||
{
|
||||
Matrix matrix;
|
||||
TransformVisitor tv(matrix,TransformVisitor::LOCAL_TO_WORLD);
|
||||
tv.accumulate(nodePath);
|
||||
return matrix;
|
||||
}
|
||||
|
||||
Matrix osg::computeWorldToLocal(NodePath& nodePath)
|
||||
{
|
||||
osg::Matrix matrix;
|
||||
TransformVisitor tv(matrix,TransformVisitor::WORLD_TO_LOCAL);
|
||||
tv.accumulate(nodePath);
|
||||
return matrix;
|
||||
}
|
||||
|
||||
Matrix osg::computeLocalToEye(const Matrix& modelview,NodePath& nodePath)
|
||||
{
|
||||
Matrix matrix(modelview);
|
||||
TransformVisitor tv(matrix,TransformVisitor::LOCAL_TO_WORLD);
|
||||
tv.accumulate(nodePath);
|
||||
return matrix;
|
||||
}
|
||||
|
||||
Matrix osg::computeEyeToLocal(const Matrix& modelview,NodePath& nodePath)
|
||||
{
|
||||
Matrix matrix;
|
||||
matrix.invert(modelview);
|
||||
TransformVisitor tv(matrix,TransformVisitor::WORLD_TO_LOCAL);
|
||||
tv.accumulate(nodePath);
|
||||
return matrix;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Transform::Transform()
|
||||
{
|
||||
_referenceFrame = RELATIVE_TO_PARENTS;
|
||||
|
Loading…
Reference in New Issue
Block a user