As far as I remember, the DataVariance set to Dynamic is causing the
problem.
Just put some instructions like :
"group->setDataVariance(osg::Object::STATIC);"
where it is necessary and this should do the trick.
Philippe Poutignat
Wiedemann, Rudolf, OPS3 a écrit :
Hi,
I want to resolve the application of an osg::PositionAttitudeTransform
to an osg::Geode by using osgUtil::Optimizer (FLATTEN_STATIC_TRANSFORMS)
as follows:
#include <osg/Geometry>
#include <osg/Geode>
#include <osg/Group>
#include <osg/PositionAttitudeTransform>
#include <osg/Notify>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
int main( int argc, char ** argv )
{
// set notify level
osg::setNotifyLevel( osg::DEBUG_FP );
// create geometry
osg::ref_ptr< osg::Geometry > geometry = new osg::Geometry;
// create vertices
osg::ref_ptr< osg::Vec3Array > vertices = new osg::Vec3Array;
vertices->push_back( osg::Vec3d( 0.0, -0.5, -0.5 ) );
vertices->push_back( osg::Vec3d( 0.0, 0.5, -0.5 ) );
vertices->push_back( osg::Vec3d( 0.0, 0.5, 0.5 ) );
vertices->push_back( osg::Vec3d( 0.0, -0.5, 0.5 ) );
// assign vertices to geometry
geometry->setVertexArray( vertices.get() );
// create quad as primitive set and assign it to geometry
geometry->addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 4 ) );
// create geode and assign geometry
osg::ref_ptr< osg::Geode > geode = new osg::Geode;
geode->addDrawable( geometry.get() );
// create group
osg::ref_ptr< osg::Group > group = new osg::Group;
// create transform
osg::PositionAttitudeTransform * transform = new
osg::PositionAttitudeTransform;
// add transform to group
group->addChild( transform );
// set scaling
transform->setScale( osg::Vec3d( 1.0, 5.0, 10.0 ) );
// add geode to transform
transform->addChild( geode.get() );
// save group to file
osgDB::writeNodeFile( * group.get(), "pre_transformed.osg" );
// optimize group
osgUtil::Optimizer optimizer;
optimizer.optimize( group.get(),
osgUtil::Optimizer::FLATTEN_STATIC_TRANSFORMS );
// save transformed group to file
osgDB::writeNodeFile( * group.get(), "transformed.osg" );
return 0;
}
Running this prints to screen:
Optimizer::optimize() doing FLATTEN_STATIC_TRANSFORMS
** RemoveStaticTransformsVisitor *** Pass 0
But the "optimized" scene graph doesn't differ from the original:
Group {
DataVariance DYNAMIC
nodeMask 0xffffffff
cullingActive TRUE
num_children 1
PositionAttitudeTransform {
DataVariance DYNAMIC
nodeMask 0xffffffff
cullingActive TRUE
referenceFrame RELATIVE
position 0 0 0
attitude 0 0 0 1
scale 1 5 10
pivotPoint 0 0 0
num_children 1
Geode {
UniqueID Geode_0
DataVariance DYNAMIC
nodeMask 0xffffffff
cullingActive TRUE
num_drawables 1
Geometry {
UniqueID Geometry_1
DataVariance DYNAMIC
useDisplayList TRUE
useVertexBufferObjects FALSE
PrimitiveSets 1
{
DrawArrays QUADS 0 4
}
VertexArray UniqueID Vec3Array_2 Vec3Array 4
{
0 -0.5 -0.5
0 0.5 -0.5
0 0.5 0.5
0 -0.5 0.5
}
}
}
}
}
Does anyone know what I'm doing wrong?
Thanks in advance!
Rudi
_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/
_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/