查看: 1133|回复: 8

如何同时绘制几条三角网,并放在同一个Geometry对象中?

[复制链接]

该用户从未签到

发表于 2017-7-3 23:16:11 | 显示全部楼层 |阅读模式
本帖最后由 唐俊_x60up 于 2017-7-14 16:45 编辑

求助各位前辈,我自己知道通过顶点绘制了一个三角网,但是只知道在一个Geometry对象中放置一个三角网。如果,我想在一个Geometry中放置多个三角网应该怎么办呢?。目前的代码:
  1. osg::ref_ptr<osgUtil::DelaunayTriangulator> dt0 = new osgUtil::DelaunayTriangulator(coords0.get());
  2. osg::ref_ptr<osgUtil::DelaunayTriangulator> dt1 = new osgUtil::DelaunayTriangulator(coords1.get());
  3. osg::ref_ptr<osgUtil::DelaunayTriangulator> dt2 = new osgUtil::DelaunayTriangulator(coords2.get());
  4. osg::ref_ptr<osgUtil::DelaunayTriangulator> dt3 = new osgUtil::DelaunayTriangulator(coords3.get());
  5. osg::ref_ptr<osgUtil::DelaunayTriangulator> dt4 = new osgUtil::DelaunayTriangulator(coords4.get());
  6. osg::ref_ptr<osgUtil::DelaunayTriangulator> dt5 = new osgUtil::DelaunayTriangulator(coords5.get());
  7. //生成三角网
  8. dt0->triangulate();dt1->triangulate();dt2->triangulate();dt3->triangulate();dt4->triangulate();dt5->triangulate();
  9. //创建几何体
  10.         osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
  11.         osg::ref_ptr<osg::Geometry> geometry0 = new osg::Geometry();
  12.         osg::ref_ptr<osg::Geometry> geometry1 = new osg::Geometry();
  13.         osg::ref_ptr<osg::Geometry> geometry2 = new osg::Geometry();
  14.         osg::ref_ptr<osg::Geometry> geometry3 = new osg::Geometry();
  15.         osg::ref_ptr<osg::Geometry> geometry4 = new osg::Geometry();
  16.         osg::ref_ptr<osg::Geometry> geometry5 = new osg::Geometry();
  17.         geometry0->setVertexArray(coords0.get());
  18.         geometry1->setVertexArray(coords1.get());
  19.         geometry2->setVertexArray(coords2.get());
  20.         geometry3->setVertexArray(coords3.get());
  21.         geometry4->setVertexArray(coords4.get());
  22.         geometry5->setVertexArray(coords5.get());
  23.         geometry0->addPrimitiveSet(dt0->getTriangles());
  24.         geometry1->addPrimitiveSet(dt1->getTriangles());
  25.         geometry2->addPrimitiveSet(dt2->getTriangles());
  26.         geometry3->addPrimitiveSet(dt3->getTriangles());
  27.         geometry4->addPrimitiveSet(dt4->getTriangles());
  28.         geometry5->addPrimitiveSet(dt5->getTriangles());
复制代码

想同时把这六个三角网放在同一个Geometry对象中,求前辈指导怎么做?

该用户从未签到

 楼主| 发表于 2017-7-14 17:31:47 | 显示全部楼层
求问大神,求问大神。。。。:Q

该用户从未签到

发表于 2017-7-14 18:02:40 | 显示全部楼层
very good.
图元重启。

该用户从未签到

 楼主| 发表于 2017-7-14 20:20:06 | 显示全部楼层
liujing7256 发表于 2017-7-14 18:02
very good.
图元重启。

什么鬼?

该用户从未签到

 楼主| 发表于 2017-7-14 21:29:01 | 显示全部楼层
还有三角网绘制时,可以通过DelaunayConstraint() 加限制条件,求问这个怎么用呢?。最好能举个实例,比如说将横坐标大于1的点剔除?。。。。求问求问求问求问。:'(

该用户从未签到

发表于 2017-7-18 09:49:51 | 显示全部楼层
guy,你看看OpenGL相关资料,你就明白图元重启是个什么鬼,虽然教程讲解的比较繁琐,但简单的来说就是批量绘制图元时打断操作,遇到重启索引时OpenGL重新绘制下一个图元集合,很适合不连续的面(个面)的绘制。

该用户从未签到

发表于 2017-7-18 10:50:01 | 显示全部楼层
本帖最后由 liujing7256 于 2017-7-18 10:51 编辑

       osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
       osg::Vec3Array* vertices = new osg::Vec3Array;

       将顶点打成一组;
       vertices.insert(coords0.begin, coords0.end);
       vertices.insert(coords1.begin, coords1.end);
       ...
       如果是osg:rawArrays将索引打成一组;不是的话就:
     
        geometry->addPrimitiveSet(primitiveSet1(triangels, startIdex, coords0.size()));
        geometry->addPrimitiveSet(primitiveSet2(triangels, startIdex+coords0.size(), coords1.size()));
        ....
        注意图元索引位置

       也是可以。

该用户从未签到

 楼主| 发表于 2017-7-26 10:29:03 | 显示全部楼层
本帖最后由 唐俊_x60up 于 2017-7-26 10:30 编辑
liujing7256 发表于 2017-7-18 10:50
osg::ref_ptr geometry = new osg::Geometry();
       osg::Vec3Array* vertices = new osg::Vec3 ...


先多谢你回复了。我按照你说的看了图元重启的内容,按这个试了,还是不行。我的顶点数组不是按各三角形顶点的顺序存入的。不能用基本几何图元中的绘制三角形来绘制。只能通过构建三角网来生成各个三角形。用geometry->addPrimitiveSet(dt1->getTriangles());来添加,这时候就不能加数组的起始位置和数量这两个参数了。

该用户从未签到

发表于 2017-7-27 09:46:23 | 显示全部楼层
本帖最后由 liujing7256 于 2017-7-27 10:00 编辑
唐俊_x60up 发表于 2017-7-26 10:29
先多谢你回复了。我按照你说的看了图元重启的内容,按这个试了,还是不行。我的顶点数组不是按各三角 ...


osg:rawElementsUInt *getTriangles(), 本身返回的就是索引数组,你不要图省事,把这些数据展开,按各顶点数组偏移量(offset)重新组织一下即可。

DrawElements * drawElements = new DrawElementsUInt(TRIANGLES):

offset = 0;
drawElements->addElement(index+offset);
...

offset = vertexArray1.size();

drawElements->addElement(index+offset);
...

offset = vertexArray2.size();

drawElements->addElement(index+offset);
...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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