[osg-users] To calculate normal vector use the osg::smoothingVisitor
Hi, How to calculate normal vector using the osg::smoothingVisitor ? Guide me by providing some example related to above question . I have to find normal for lightning effect. I have draw various model using triangle strip . Now i'm in need of finding normal. Here I'have attached some part of simple model of cube . Kindly help me what is the best way for me to finding normal here Some part of my code is : // front face of Cube { { osg::Geometry* pGeo = new osg::Geometry; // add 4 vertices creating a quad osg::Vec3Array* pVerts = new osg::Vec3Array(3); (*pVerts)[0].set((*points1)[0].x() ,(*points1)[0].y() , (*points1)[0].z()); (*pVerts)[1].set((*points1)[1].x() ,(*points1)[1].y() , (*points1)[1].z()); (*pVerts)[2].set((*points1)[2].x() ,(*points1)[2].y() , (*points1)[2].z()); pGeo-setVertexArray( pVerts ); // create a primitive set osg::DrawElementsUInt* pPrimitiveSet = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 ); pPrimitiveSet-push_back( 0 ); pPrimitiveSet-push_back( 1 ); pPrimitiveSet-push_back( 2 ); pGeo-addPrimitiveSet( pPrimitiveSet ); // create an arraw for texture coordinates osg::Vec2Array* pTexCoords = new osg::Vec2Array( 3 ); (*pTexCoords)[0].set( (*points2)[9].x() , (*points2)[9].y() ); (*pTexCoords)[1].set( (*points2)[8].x() , (*points2)[8].y() ); (*pTexCoords)[2].set( (*points2)[7].x() , (*points2)[7].y() ); pGeo-setTexCoordArray( 0, pTexCoords ); // create geometry node that will contain all our drawables geode-addDrawable( pGeo ); } { osg::Geometry* pGeo = new osg::Geometry; // add 4 vertices creating a quad osg::Vec3Array* pVerts = new osg::Vec3Array(3); (*pVerts)[0].set((*points1)[0].x() ,(*points1)[0].y() , (*points1)[0].z()); (*pVerts)[1].set((*points1)[2].x() ,(*points1)[2].y() , (*points1)[2].z()); (*pVerts)[2].set((*points1)[3].x() ,(*points1)[3].y() , (*points1)[3].z()); pGeo-setVertexArray( pVerts ); // create a primitive set osg::DrawElementsUInt* pPrimitiveSet = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 ); pPrimitiveSet-push_back( 0 ); pPrimitiveSet-push_back( 1 ); pPrimitiveSet-push_back( 2 ); pGeo-addPrimitiveSet( pPrimitiveSet ); // create an arraw for texture coordinates osg::Vec2Array* pTexCoords = new osg::Vec2Array( 3 ); (*pTexCoords)[0].set( (*points2)[9].x() , (*points2)[9].y() ); (*pTexCoords)[1].set( (*points2)[7].x() , (*points2)[7].y() ); (*pTexCoords)[2].set( (*points2)[10].x() , (*points2)[10].y() ); pGeo-setTexCoordArray( 0, pTexCoords ); // create geometry node that will contain all our drawables geode-addDrawable( pGeo ); } } //Side right face { { osg::Geometry* pGeo = new osg::Geometry; // add 4 vertices creating a quad osg::Vec3Array* pVerts = new osg::Vec3Array(3); (*pVerts)[0].set((*points1)[1].x() ,(*points1)[1].y() , (*points1)[1].z()); (*pVerts)[1].set((*points1)[5].x() ,(*points1)[5].y() , (*points1)[5].z()); (*pVerts)[2].set((*points1)[6].x() ,(*points1)[6].y() , (*points1)[6].z()); pGeo-setVertexArray( pVerts ); // create a primitive set osg::DrawElementsUInt* pPrimitiveSet = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 ); pPrimitiveSet-push_back( 0 ); pPrimitiveSet-push_back( 1 ); pPrimitiveSet-push_back( 2 ); pGeo-addPrimitiveSet( pPrimitiveSet ); // create an arraw for texture coordinates osg::Vec2Array* pTexCoords = new osg::Vec2Array( 3 ); (*pTexCoords)[0].set( (*points2)[6].x() , (*points2)[6].y() ); (*pTexCoords)[1].set( (*points2)[5].x() , (*points2)[5].y() ); (*pTexCoords)[2].set( (*points2)[4].x() , (*points2)[4].y() ); pGeo-setTexCoordArray( 0, pTexCoords ); // create geometry node that will contain all our drawables geode-addDrawable( pGeo ); } {
Re: [osg-users] To calculate normal vector use the osg::smoothingVisitor
Hi Manish, I'm a bit confused a bit by your post, you seem to have included a lot of code for what is potentially just a very simple question, so it makes me wonder if you aren't asking something else... To use the smoothing visitor you simple do: osgUtil::SmoothingVisitor sv; node-accept(sv); Where node is your scene graph, be it one geode or a whole scene. Robert. On Tue, Nov 9, 2010 at 10:30 AM, manish Choudhary osgfo...@tevs.eu wrote: Hi, How to calculate normal vector using the osg::smoothingVisitor ? Guide me by providing some example related to above question . I have to find normal for lightning effect. I have draw various model using triangle strip . Now i'm in need of finding normal. Here I'have attached some part of simple model of cube . Kindly help me what is the best way for me to finding normal here Some part of my code is : // front face of Cube { { osg::Geometry* pGeo = new osg::Geometry; // add 4 vertices creating a quad osg::Vec3Array* pVerts = new osg::Vec3Array(3); (*pVerts)[0].set((*points1)[0].x() ,(*points1)[0].y() , (*points1)[0].z()); (*pVerts)[1].set((*points1)[1].x() ,(*points1)[1].y() , (*points1)[1].z()); (*pVerts)[2].set((*points1)[2].x() ,(*points1)[2].y() , (*points1)[2].z()); pGeo-setVertexArray( pVerts ); // create a primitive set osg::DrawElementsUInt* pPrimitiveSet = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 ); pPrimitiveSet-push_back( 0 ); pPrimitiveSet-push_back( 1 ); pPrimitiveSet-push_back( 2 ); pGeo-addPrimitiveSet( pPrimitiveSet ); // create an arraw for texture coordinates osg::Vec2Array* pTexCoords = new osg::Vec2Array( 3 ); (*pTexCoords)[0].set( (*points2)[9].x() , (*points2)[9].y() ); (*pTexCoords)[1].set( (*points2)[8].x() , (*points2)[8].y() ); (*pTexCoords)[2].set( (*points2)[7].x() , (*points2)[7].y() ); pGeo-setTexCoordArray( 0, pTexCoords ); // create geometry node that will contain all our drawables geode-addDrawable( pGeo ); } { osg::Geometry* pGeo = new osg::Geometry; // add 4 vertices creating a quad osg::Vec3Array* pVerts = new osg::Vec3Array(3); (*pVerts)[0].set((*points1)[0].x() ,(*points1)[0].y() , (*points1)[0].z()); (*pVerts)[1].set((*points1)[2].x() ,(*points1)[2].y() , (*points1)[2].z()); (*pVerts)[2].set((*points1)[3].x() ,(*points1)[3].y() , (*points1)[3].z()); pGeo-setVertexArray( pVerts ); // create a primitive set osg::DrawElementsUInt* pPrimitiveSet = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 ); pPrimitiveSet-push_back( 0 ); pPrimitiveSet-push_back( 1 ); pPrimitiveSet-push_back( 2 ); pGeo-addPrimitiveSet( pPrimitiveSet ); // create an arraw for texture coordinates osg::Vec2Array* pTexCoords = new osg::Vec2Array( 3 ); (*pTexCoords)[0].set( (*points2)[9].x() , (*points2)[9].y() ); (*pTexCoords)[1].set( (*points2)[7].x() , (*points2)[7].y() ); (*pTexCoords)[2].set( (*points2)[10].x() , (*points2)[10].y() ); pGeo-setTexCoordArray( 0, pTexCoords ); // create geometry node that will contain all our drawables geode-addDrawable( pGeo ); } } //Side right face { { osg::Geometry* pGeo = new osg::Geometry; // add 4 vertices creating a quad osg::Vec3Array* pVerts = new osg::Vec3Array(3); (*pVerts)[0].set((*points1)[1].x() ,(*points1)[1].y() , (*points1)[1].z()); (*pVerts)[1].set((*points1)[5].x() ,(*points1)[5].y() , (*points1)[5].z()); (*pVerts)[2].set((*points1)[6].x() ,(*points1)[6].y() , (*points1)[6].z()); pGeo-setVertexArray( pVerts ); // create a primitive set osg::DrawElementsUInt* pPrimitiveSet = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 ); pPrimitiveSet-push_back( 0 ); pPrimitiveSet-push_back( 1 ); pPrimitiveSet-push_back( 2 ); pGeo-addPrimitiveSet( pPrimitiveSet ); // create an arraw for texture coordinates osg::Vec2Array* pTexCoords = new osg::Vec2Array( 3 ); (*pTexCoords)[0].set( (*points2)[6].x() , (*points2)[6].y() ); (*pTexCoords)[1].set( (*points2)[5].x() ,
Re: [osg-users] To calculate normal vector use the osg::smoothingVisitor
Hi, yes , now I'm getting normal effect on lightning by using osg::smoothingVisitor. thanks for help ... Thank you! Cheers, manish -- Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=33607#33607 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org