HI Sonya,

If you are using osgUtil::SmoothingVisitor you won't need to assign the
normals as the smoothing visitor will do this for.  By default the
smoothing visitor will smooth edges as you have see in your picture, this
is a natural consequence of the vertices at the edges being adjacent to
several triangles each with their own orientation, but as there is only one
normal per vertex is direction is an average of all the normals that share
that vertex.

In recent versions of the OSG osgUtil::SmoothingVisitor has a new feature
setCreateAngle(double angle), which.. copying and pasting the inline docs:

        /// set the maximum angle, in radians, at which angle between
adjacent triangles that normals are smoothed
        /// for edges that greater the shared vertices are duplicated
        void setCreaseAngle(double angle) { _creaseAngle = angle; }

So just add this and set an angle such as :

  osgUtil::SmoothingVisitor sv;
  sv.setCreateAngle(osg::inDegrees(90.0)); // note inDegrees converts a
angle in degrees in to radians.
  sv.smooth(*geometry);

Robert.


On 2 September 2014 13:53, Sonya Blade <[email protected]> wrote:

> Dear All,
>
> I'm trying to create arbitray shape by manually entering the vertices normals
> and indices of object.
> For this I use the following pseudo algorithm for object creation, but
> the resulting shape edges are
> not discernible as shown in the attached snapshot (marked with purple
> ellipse).
>
> Also manually created object is not recognized by the Intersectors while
> the "T" shaped object is recognized.
>
> osg::Node * CreatObject()
> {
>     //    VERTICES
>     osg::Vec3Array* obj_vertices  = new osg::Vec3Array;
>     obj_vertices->push_back(osg::Vec3d(-3.0000, 4.0000, -0.0000));
>     ......
>
>     /// NORMALS
>     osg::Vec3d vec1, vec2, vec3;
>     osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
>     vec1[0] = 0; vec1[1] = 0; vec1[3] =-1;
>      ....
>
>  
> normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);
>
> normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);
>
> normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);
>     ............
>
>     // INDICES
>     osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
>     geom->setVertexArray( obj_vertices );
>     geom->addPrimitiveSet( indices.get() );
>     geom->setNormalArray(normals.get());
>
> geom->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);
>     geom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
>
>     osgUtil::SmoothingVisitor::smooth( *geom );
>     osg::ref_ptr<osg::Geode> I_object = new osg::Geode;
>     I_object->addDrawable( geom.get() );
>     scene_ALL->addChild(I_object);
> }
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to