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

Reply via email to