|
用osgUtil:elaunayTriangulator构建了一块地形,但是中间有一块好像是正反面反转了,不知何因,请大佬们指教。
代码:
- void OsgViewWidget::setCoordinates(const double *coords, int size)
- {
- osg::ref_ptr<osg::Vec3Array> pointArray = new osg::Vec3Array();
- for (int i = 0; i < size; i += 3)
- pointArray->push_back(osg::Vec3(coords[i], coords[i + 1], -coords[i + 2] * 10)); // Z值相对较小,这里放大10倍
- osg::ref_ptr<osgUtil::DelaunayTriangulator> dt = new osgUtil::DelaunayTriangulator();
- dt->setInputPointArray(pointArray);
- dt->setOutputNormalArray(normals);
- dt->triangulate();
- osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
- geom->setVertexArray(pointArray.get());
- geom->addPrimitiveSet(dt->getTriangles());
- geom->setNormalArray(normals.get());
- geom->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
- osg::ref_ptr<osg::Geode> geode = new osg::Geode();
- geode->addDrawable(geom.get());
- // use smoothing visitor to set the average normals
- osgUtil::SmoothingVisitor sv;
- sv.apply(*geode);
- // set material for the surface
- osg::ref_ptr<osg::StateSet> stateSet = geom->getOrCreateStateSet();
- // osg::ref_ptr<osg::Material> material = new osg::Material();
- // material->setDiffuse(osg::Material::FRONT, /*osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f)*/_surfaceColor);
- // material->setSpecular(osg::Material::FRONT, osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
- // material->setShininess(osg::Material::FRONT, 100.0f);
- // stateSet->setAttribute(material);
- osg::PolygonMode *polyMode = new osg::PolygonMode();
- polyMode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
- stateSet->setAttribute(polyMode);
- osg::ref_ptr<osg::MatrixTransform> cameraPos = new osg::MatrixTransform();
- cameraPos->setMatrix(osg::Matrix::rotate(osg::inDegrees(45.f), 1, 0, 0));
- cameraPos->addChild(geode);
- osg::ref_ptr<osg::Group> root = new osg::Group();
- root->addChild(cameraPos);
- _viewer->setSceneData(root.get());
- }
复制代码
另外,osgUtil::DelaunayTriangulator怎么处理凹多边形的问题,也请一并指教。谢谢! |
-
|