2.8 branch: osgconv support for --use-world-frame, from Ryan Pavlik, with tweak by Robert Osfield.

This commit is contained in:
Paul MARTZ
2011-05-27 14:17:23 +00:00
parent fe40f0b9a4
commit 6ceb0a8f87
3 changed files with 31 additions and 6 deletions

View File

@@ -12,6 +12,7 @@ OrientationConverter::OrientationConverter( void )
R.makeIdentity();
T.makeIdentity();
_trans_set = false;
_use_world_frame = false;
S.makeIdentity();
}
@@ -36,21 +37,35 @@ void OrientationConverter::setScale( const Vec3 &scale )
S = Matrix::scale(scale);
}
void OrientationConverter::useWorldFrame( bool worldFrame )
{
_use_world_frame = worldFrame;
}
Node* OrientationConverter::convert( Node *node )
{
// Order of operations here is :
// 1. Translate to world origin (0,0,0)
// 1. If world frame option not set, translate to world origin (0,0,0)
// 2. Rotate to new orientation
// 3. Scale in new orientation coordinates
// 4. If an absolute translation was specified then
// - translate to absolute translation in world coordinates
// else
// - translate back to model's original origin.
// else if world frame option not set,
// - translate back to model's original origin.
BoundingSphere bs = node->getBound();
Matrix C = Matrix::translate( -bs.center() );
if( _trans_set == false )
T = Matrix::translate( bs.center() );
Matrix C;
if (_use_world_frame)
{
C.makeIdentity();
}
else
{
C = Matrix::translate( -bs.center() );
if( !_trans_set )
T = Matrix::translate( bs.center() );
}
osg::Group* root = new osg::Group;
osg::MatrixTransform* transform = new osg::MatrixTransform;

View File

@@ -14,6 +14,7 @@ class OrientationConverter {
void setRotation( float degrees, const osg::Vec3 &axis );
void setTranslation( const osg::Vec3 &trans);
void setScale( const osg::Vec3 &trans);
void useWorldFrame( bool worldFrame );
/** return the root of the updated subgraph as the subgraph
* the node passed in my flatten during optimization.*/
@@ -25,6 +26,7 @@ class OrientationConverter {
osg::Matrix R, T, S;
bool _trans_set;
bool _use_world_frame;
};
#endif

View File

@@ -478,6 +478,9 @@ static void usage( const char *prog, const char *msg )
" where X, Y, and Z represent the coordinates of the\n"
" absolute position in world space\n"
<< std::endl;
osg::notify(osg::NOTICE)<<" --use-world-frame - Perform transformations in the world frame, rather\n"
" than relative to the center of the bounding sphere.\n"
<< std::endl;
osg::notify(osg::NOTICE)<<" --simplify n - Run simplifier prior to output. Argument must be a" << std::endl
<<" normalized value for the resultant percentage" << std::endl
<<" reduction." << std::endl
@@ -591,6 +594,11 @@ int main( int argc, char **argv )
OrientationConverter oc;
bool do_convert = false;
if (arguments.read("--use-world-frame"))
{
oc.useWorldFrame(true);
}
std::string str;
while (arguments.read("-O",str))
{