Hi Akilan; Matrix multiplaction is not commutative. If you change the order of matrix as a result the accumulated matrix will behave different as you anticipated. So order of matrix multiplexing is Scale, Rotate and lastly Translate. So in multiplexting operation order of them as follows; AccumulatedMatrix = TranslateMatrix * RotateMatrix * ScaleMatrix;
So I suggest you to use one MatrixTransform because you can do all operation in one MatrixTransform too. And try rotMT->setMatrix(tmatrix * rmatrix); and delete transMT. Use single MatrixTransform. HTH. Regards. Ümit Uzun 2009/9/10 Akilan Thangamani <akilan.thangam...@gmail.com> > Hi, > > yeah. I found my geometry center as ( 0.04,0.075,0.0). So first I do the > rotation of 90 degree about z-axis and then translating my geometry to 0 by > subtracting the aboive center values. > Again I m getting my geometry is translated and half of the geometry is > off the view. Have a look at my code, I dont understand where I am making > mistake. > > void applyTexture(osg::Drawable* drawable, std::string imgName) > { > static std::string filePath = getenv("OSGHOME"); > osg::ref_ptr<osg::Image> image = osgDB::readImageFile(filePath + > imgName); > osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D; > tex2D->setImage(image.get()); > tex2D->setResizeNonPowerOfTwoHint(false); > drawable->getOrCreateStateSet()->setTextureAttributeAndModes > (0, tex2D.get()); > drawable->getOrCreateStateSet()->setMode(GL_LIGHTING, > osg::StateAttribute::OVERRIDE | > osg::StateAttribute::OFF); > osg::ref_ptr<osg::TexEnv> texEnv = new osg::TexEnv; > texEnv->setMode(osg::TexEnv::REPLACE); > drawable->getOrCreateStateSet()->setTextureAttributeAndModes > (0, texEnv.get()); > } > > osg::Geode* createGeometry() > { > float x = 0.0, y = 0.0; > float width=0.08 , height=0.15 ; > std::string imgName="\\images\\ring_active.png"; > osg::Geometry* boxGeom = new osg::Geometry; > > boxGeom->setName("myGeometry"); > osg::Vec3Array* vertices = new osg::Vec3Array; > int _z=0.0; > vertices->push_back(osg::Vec3(x, y, _z)); > vertices->push_back(osg::Vec3(x + width, y, _z)); > vertices->push_back(osg::Vec3(x + width, y + height, _z)); > vertices->push_back(osg::Vec3(x, y + height , _z)); > boxGeom->setVertexArray(vertices); > osg::Vec3Array* normals = new osg::Vec3Array; > normals->push_back(osg::Vec3(0.0f,50.0f,1.0f)); > boxGeom->setNormalArray(normals); > boxGeom->setNormalBinding(osg::Geometry::BIND_OVERALL); > osg::Vec4Array* colors = new osg::Vec4Array; > colors->push_back(osg::Vec4(0., 0., 0., 0.9)); > boxGeom->setColorArray(colors); > boxGeom->setColorBinding(osg::Geometry::BIND_OVERALL); > //applying texture > osg::ref_ptr<osg::Vec2Array> texCoordArray = new osg::Vec2Array; > texCoordArray->push_back(osg::Vec2(0.f, 0.f)); > texCoordArray->push_back(osg::Vec2(1.0, 0.f)); > texCoordArray->push_back(osg::Vec2(1.0, 1.0)); > texCoordArray->push_back(osg::Vec2(0.0, 1.0)); > boxGeom->setTexCoordArray(0, texCoordArray.get()); > applyTexture(boxGeom, imgName); > boxGeom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4)); > osg::StateSet* stateset = boxGeom->getOrCreateStateSet(); > stateset->setMode(GL_BLEND,osg::StateAttribute::ON); > stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); > osg::Geode* _geode=new osg::Geode; > _geode->addDrawable(boxGeom); > _geode->setName("myGeode"); > geometry_center=boxGeom->getBound().center(); > return _geode; > } > > > > int main( int argc, char **argv ) > > { > osg::Camera* g_camera=new osg::Camera; > g_camera->setProjectionMatrixAsOrtho2D(0,1,0,1.25); > g_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); > g_camera->setClearMask(GL_DEPTH_BUFFER_BIT); > g_camera->setRenderOrder(osg::Camera::POST_RENDER); > //rotate > osg::ref_ptr<osg::MatrixTransform> rotMT=new > osg::MatrixTransform; osg::Matrix rmatrix; > > rmatrix.makeRotate(osg::DegreesToRadians(45.),osg::Vec3f(0.0,0.0,1.0)); > rotMT->setMatrix(rmatrix); > > //translate > osg::ref_ptr<osg::MatrixTransform> transMT=new > osg::MatrixTransform; osg::Matrix tmatrix; > tmatrix.makeTranslate(osg::Vec3f(-0.04,-0.075,0.0)); > transMT->setMatrix(tmatrix); > > rotMT->addChild(transMT.get()); > transMT->addChild(createGeometry()); > g_camera->addChild(rotMT.get()); > > > osgViewer::Viewer viewer; > > viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); > viewer.setCameraManipulator( new osgGA::TrackballManipulator() > ); > viewer.addEventHandler(new Rot); > viewer.setSceneData(g_camera); > > osg::Vec3d eye(osg::Vec3f(0.0,0.0,0.0)); > osg::Vec3d center(osg::Vec3f(0.0,0.0,0.0)); > osg::Vec3d up(osg::Vec3f(0.0,0.0,0.0)); > > viewer.getCameraManipulator()->setHomePosition(eye,center,up); > viewer.home(); > viewer.realize(); > > while(!viewer.done()) > viewer.frame(); > > return 0; > > } > > > > > > Cheers, > Akilan > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=17210#17210 > > > > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org