查看: 1913|回复: 4

osg::Geometry的BIND_PER_PRIMITIVE被弃用了,现在法矢怎么绑定面片了

[复制链接]

该用户从未签到

发表于 2015-11-24 14:51:31 | 显示全部楼层 |阅读模式
osg::Vec3Array* vetrices = new osg::Vec3Array(nVertex);
geom->setVertexArray(vertives);

osg::vec3Array* normals = new osg::vec3Array(numTriangles);
memcpy(&(normal[0][0]), ppt, sizeof(float)*numTriangles*3);                     //获得每个三角面片的法矢
geom->setNormalArray(normal, osg::Array::BIND_PER_PRIMITIVE_SET);  //设置法矢绑定方式

osg::ref_Ptr<osg:rawElementUInt> Primitives = new osg::DrawElementUInt(GL_TRIGNALE, 3*numTrianles);
memcpy(&(primitives[0][0]), &indexss[0], sizeof(int)* numTriangle*3);            //拷贝顶点序号

geom->addPrimitiveSet(Primitives);  



我要显示网格对象,现在需要将网格三角面片的方式绑定到各个三角面片上。上面这样写OSG内部还会崩溃,好像是法矢绑定的方式错误, 以前有BIND_PER_PRIMITIVE,但现在舍弃了,那现在该怎么写法?

该用户从未签到

发表于 2015-11-24 20:26:18 | 显示全部楼层
不是绑定的问题,是memcpy的问题,Vec3array中每个元素是Vec3,其大小并非3个float,还有一个表示维度的变量,你看下源码就知道了。

该用户从未签到

 楼主| 发表于 2015-11-27 09:05:45 | 显示全部楼层
江湖贫侠 发表于 2015-11-24 20:26
不是绑定的问题,是memcpy的问题,Vec3array中每个元素是Vec3,其大小并非3个float,还有一个表示维度的变 ...

我查了一下源码Vec3应该就是3个float,vec4才是4个float。我现在使用osg3.2.0版本,在这个版本中,BING_PER_PRIMITIVE已被舍弃,我论坛上别人说这种方式性能低下。现在我使用了两种方式来显示网格对象。
第一种,使用array indices 和BIND_PER_PRIMITIVE arrays的方式,显示网格效果不错,但是在3.2.0中此种方式已被完全舍弃。 并且网格显示效果如下,这种方式显示出的网格正常,使用的是每个三角面片绑定法矢,但这种被舍弃的方式在更新网格位置时就会有问题,而且可能效率比较低。


第二种:使用DrawElementsUInt来创建网格,并用新的geometry,但此种方式中已经没有BIND_PER_PRIMITIVE,所以我直接使用了BIND_PER_VERTEX,但这种方式显示的网格有问题。

上面出现的这种显示问题,我认为是法矢绑定在每个顶点上造成的,现在我想使用DrawElementUInt的方式来创建网格,并且想要法矢绑定在网格面片上,请问该怎么解决呢??

该用户从未签到

发表于 2015-11-27 09:14:33 | 显示全部楼层
wang15061955806 发表于 2015-11-27 09:05
我查了一下源码Vec3应该就是3个float,vec4才是4个float。我现在使用osg3.2.0版本,在这个版本中,BING_P ...

我看到的是你C++用法的错误,osg::Vec3的类源码是:
  1. class Vec3d
  2. {
  3.     public:

  4.         /** Data type of vector components.*/
  5.         typedef double value_type;

  6.         /** Number of vector components. */
  7.         enum { num_components = 3 };

  8.         value_type _v[3];
  9. ......
  10. }
复制代码


其中3个浮点型加一个enum(即int)形,你直接把osg::Vec3array看作3*N个浮点型肯定会导致osg崩溃。

所以我猜你的问题和osg法向的绑定方式无关,是你对c++理解的问题。

该用户从未签到

 楼主| 发表于 2015-11-27 12:57:24 | 显示全部楼层
江湖贫侠 发表于 2015-11-27 09:14
我看到的是你C++用法的错误,osg::Vec3的类源码是:

你说的是没错,vec3中的枚举也会占用内存,不过使用memcpy()进行拷贝不会出现问题,拷贝出的顶点坐标和顶点索引都没有问题。而且现在不是程序奔溃的问题,上述代码不会造成程序崩溃。是我上传的图片中显示的问题,在OSG3.2.0中只有BIND_PER_VERTEX了,原来的BIND_PER_PRIMITIVE被删除了。所以显示出的网格效果不光顺,我想请问怎么解决?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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