[osg-users] Same vertices selected multiple times
Julien Valentin
julienvalentin51 at gmail.com
Fri Jan 12 12:47:07 PST 2018
Hi Antoine
No magic here...
Either you share vertices among triangles else you manage yourself duplicates during selection....
Cheers
arennuit wrote:
> Dear OSG forum,
>
> I have a vertices selection problem (these are the vertices of a mesh). When I select vertices, each vertex appears multiple times in my selection (e.g. if I select 30000 vertices, there are actually 90000 entries in the selected vertices array - each vertex being duplicated).
>
> The reason of this behavior stems from the way I have coded the selection: I actually select faces/triangles, then look for the corresponding vertices and add these to my selected vertices array, via this code:
>
>
> Code:
>
> // Find the primitives inside the polygon.
> osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector( osgUtil::Intersector::WINDOW, polytope );
> osgUtil::IntersectionVisitor intersectionVisitor( intersector.get() );
> viewer->getCamera()->accept( intersectionVisitor );
>
> if ( !intersector->containsIntersections() )
> return;
>
> // Loop through each primitive.
> primitives.reserve( intersector->getIntersections().size() );
>
> for (auto it = intersector->getIntersections().begin(); it != intersector->getIntersections().end(); ++it)
> {
> osgUtil::PolytopeIntersector::Intersection intersection = *it;
>
> primitives.push_back( intersection.primitiveIndex );
> }
>
> std::vector<unsigned int> subObjects;
> for (uint i = 0; i< primitives.size(); ++i)
> {
> subObjects.push_back(3 * primitives[i]);
> subObjects.push_back(3 * primitives[i] + 1);
> subObjects.push_back(3 * primitives[i] + 2);
> }
>
>
>
>
> subObjects being my vertices array.
>
> Do you have any idea of how I could do to only select vertices once rather than multiple times?
>
> THIS IS NOT DIRECTLY LINKED TO THE QUESTION BUT IT COULD HAVE AN IMPACT ON YOUR ANSWER: for your information, currently the mesh is drawn in such a way that vertices are NOT shared among triangles (that is if 2 triangles share the same vertex, the same vertex appears twice in the vertices array) as shown below:
>
>
> Code:
>
> osg::ref_ptr<osg::Geode> SetupMesh(const Eigen::Vector3Array& vertices, IntegerArray const& triangles, const Eigen::Vector3Array& normals, const osg::Vec4f& color, Node* node)
> {
> osg::ref_ptr<osg::Geode> geode = new osg::Geode();
> assert(geode);
> osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
> assert(geometry);
> osg::ref_ptr<osg::Vec3Array> vertices_osg = new osg::Vec3Array();
> assert(vertices_osg);
> osg::ref_ptr<osg::Vec3Array> normals_osg = new osg::Vec3Array();
> assert(normals_osg);
> osg::ref_ptr<osg::DrawElementsUInt> triangles_osg = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
> assert(triangles_osg);
> osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array();
> assert(colors);
>
> // Attach a reference to the node inside the geometry.
> // NOTE: this is used for picking.
> osg::ref_ptr<NodeReference> userData = new NodeReference(node);
> geometry->setUserData(userData);
>
> // Use VBOs (rather than deprecated display lists).
> geometry->setUseVertexBufferObjects(true);
>
> // Setup.
> geode->addDrawable(geometry);
> geometry->setVertexArray(vertices_osg);
> geometry->setNormalArray(normals_osg);
> geometry->addPrimitiveSet(triangles_osg);
> geometry->setColorArray(colors);
>
> // Vertices.
> vertices_osg->reserve(vertices.size());
> for (int i = 0; i < vertices.size(); ++i)
> vertices_osg->push_back(EigenToOsgVector3(vertices[i]));
>
> // Normals.
> normals_osg->setBinding(osg::Array::BIND_PER_VERTEX);
>
> normals_osg->reserve(normals.size());
> for (int i = 0; i < normals.size(); ++i)
> normals_osg->push_back(EigenToOsgVector3(normals[i]));
>
> // Triangles (primitive sets).
> triangles_osg->reserve(triangles.size());
> for (int i = 0; i < triangles.size(); ++i)
> triangles_osg->push_back(triangles[i]);
>
> // Colors.
> colors->setBinding(osg::Array::BIND_PER_VERTEX);
>
> colors->reserve(vertices.size());
> for (int i = 0; i < vertices.size(); ++i)
> colors->push_back(color);
>
> return geode;
> }
>
>
>
>
> Kind regards,
>
> Antoine.
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=72747#72747
More information about the osg-users
mailing list