查看: 1027|回复: 0

osgUtil::DelaunayTriangulator正反面问题

[复制链接]

该用户从未签到

发表于 2020-11-11 21:29:38 | 显示全部楼层 |阅读模式
用osgUtil:elaunayTriangulator构建了一块地形,但是中间有一块好像是正反面反转了,不知何因,请大佬们指教。
代码:
  1. void OsgViewWidget::setCoordinates(const double *coords, int size)
  2. {
  3.     osg::ref_ptr<osg::Vec3Array> pointArray = new osg::Vec3Array();
  4.     for (int i = 0; i < size; i += 3)
  5.         pointArray->push_back(osg::Vec3(coords[i], coords[i + 1], -coords[i + 2] * 10)); // Z值相对较小,这里放大10倍

  6.     osg::ref_ptr<osgUtil::DelaunayTriangulator> dt = new osgUtil::DelaunayTriangulator();
  7.     dt->setInputPointArray(pointArray);
  8.     dt->setOutputNormalArray(normals);
  9.     dt->triangulate();

  10.     osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
  11.     geom->setVertexArray(pointArray.get());
  12.     geom->addPrimitiveSet(dt->getTriangles());
  13.     geom->setNormalArray(normals.get());
  14.     geom->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);

  15.     osg::ref_ptr<osg::Geode> geode = new osg::Geode();
  16.     geode->addDrawable(geom.get());

  17.     // use smoothing visitor to set the average normals
  18.     osgUtil::SmoothingVisitor sv;
  19.     sv.apply(*geode);

  20.     // set material for the surface
  21.     osg::ref_ptr<osg::StateSet> stateSet = geom->getOrCreateStateSet();
  22. //    osg::ref_ptr<osg::Material> material = new osg::Material();
  23. //    material->setDiffuse(osg::Material::FRONT, /*osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f)*/_surfaceColor);
  24. //    material->setSpecular(osg::Material::FRONT, osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
  25. //    material->setShininess(osg::Material::FRONT, 100.0f);
  26. //    stateSet->setAttribute(material);

  27.     osg::PolygonMode *polyMode = new osg::PolygonMode();
  28.     polyMode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
  29.     stateSet->setAttribute(polyMode);

  30.     osg::ref_ptr<osg::MatrixTransform> cameraPos = new osg::MatrixTransform();
  31.     cameraPos->setMatrix(osg::Matrix::rotate(osg::inDegrees(45.f), 1, 0, 0));
  32.     cameraPos->addChild(geode);

  33.     osg::ref_ptr<osg::Group> root = new osg::Group();
  34.     root->addChild(cameraPos);
  35.     _viewer->setSceneData(root.get());
  36. }
复制代码


另外,osgUtil::DelaunayTriangulator怎么处理凹多边形的问题,也请一并指教。谢谢!
problem_dt.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表