[osg-users] To calculate normal vector use the osg::smoothingVisitor

2010-11-09 Thread manish Choudhary
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

2010-11-09 Thread Robert Osfield
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

2010-11-09 Thread manish Choudhary
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