查看: 1785|回复: 8

多个Geometry共用顶点数组,更新回调有错动的问题

[复制链接]

该用户从未签到

发表于 2013-5-23 11:07:03 | 显示全部楼层 |阅读模式
各位高手,小生初学OSG,遇到这个问题。
假设要建立一个房屋,我在一个Geode节点下建了两个Geometry,一个是墙Wall,一个是屋顶Top,定义一个Vec3Array作为这两者共享的顶点数组。将Wall和Top的显式列表关闭,VBO打开,然后我对Wall设置了如下的简单UpdateCallback:
  1. class EarthquakeCallBack:public osg::Drawable::UpdateCallback
  2. {
  3. public:
  4.         EarthquakeCallBack()
  5.         {
  6.                 period=0;
  7.                 label=0;
  8.         }

  9.         virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawble)
  10.         {
  11.                 osg::Geometry* geom =dynamic_cast<osg::Geometry*>(drawble);
  12.                 if (!geom) return;
  13.                 osg::Vec3Array* vertices= dynamic_cast<osg::Vec3Array*> (geom->getVertexArray());
  14.                 if (vertices)
  15.                 {
  16.                         if (label==0)
  17.                         {
  18.                                 for (osg::Vec3Array::iterator itr=vertices->begin();itr!=vertices->end();++itr)
  19.                                         itr->_v[0]++;
  20.                                 period++;
  21.                         } else{
  22.                                 for (osg::Vec3Array::iterator itr=vertices->begin();itr!=vertices->end();++itr)
  23.                                         itr->_v[0]--;
  24.                                 period--;
  25.                         }
  26.                 vertices->dirty();
  27.                 }
  28.                 if (period>10) label=1;
  29.                 if (period<-10) label=0;
  30.         }
  31. private:
  32.         int period;
  33.         int label;
  34. };
复制代码
这样这个房子应该是在左右摇晃,房顶和墙应该都在移动,但是我发现两个Geometry更新节点不同步,会有一定的错动。
我觉得Callback本身应该没有出错,是不是对Viewer有一些特殊的设置可以避免这个问题?求赐教

该用户从未签到

发表于 2013-5-23 12:15:03 | 显示全部楼层
应该保证Wall 是在 房顶之前调用这个 updatecallback  也就是wall 要先被updateVisitor 访问到

该用户从未签到

 楼主| 发表于 2013-5-23 12:40:06 | 显示全部楼层
本帖最后由 guch1234 于 2013-5-23 12:55 编辑
liuzhiyu123 发表于 2013-5-23 12:15
应该保证Wall 是在 房顶之前调用这个 updatecallback  也就是wall 要先被updateVisitor 访问到


嗯,Wall在Geode中是0号Drawable,Top是1号,Wall的updataCallback也在Top之前。

======================================================


我发现问题了,把Viewer改成singleThread,就没有错动了...


不过还有个其他问题,我的屋顶Top其实就是一个多边形,其纹理采用一个小贴图,然后repeat+Texgen实现的,但是我在进行上面那样的updateCallback的时候,发现贴图并不随着屋顶的摇晃而晃动(就是屋顶的多边形在摇晃,但是贴图相对于屏幕没有动),请问这是由于Texgen自动生成纹理坐标导致的吗?有没有什么解决办法?

该用户从未签到

发表于 2013-5-23 15:40:44 | 显示全部楼层
贴图坐标没有随变化的顶点绑定
(也就是说你的贴图坐标是固定不变的,当然就会是不动的)

该用户从未签到

 楼主| 发表于 2013-5-23 19:03:21 | 显示全部楼层
VR_user_happy 发表于 2013-5-23 15:40
贴图坐标没有随变化的顶点绑定
(也就是说你的贴图坐标是固定不变的,当然就会是不动的)

原来如此...那在使用了texgen自动生成纹理坐标的情况下能否进行绑定呢?求赐教

该用户从未签到

发表于 2013-5-23 19:57:00 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-5-23 20:03 编辑

自动生成,系统怎么知道你个贴图应该怎么绑定到对应的那个顶点?

参看:
osg::Geometry* pShapeGeometry = new osg::Geometry();
贴图顶点数组:
osg::Vec3Array* myShapeVertices = new osg::Vec3Array;
myShapeVertices->push_back(...

重点1:
创建顶点贴图数组(需要贴图的上面的几何体的相对应)
要一一对应(贴图几何体有几个顶点,就要设定几个对应的贴图坐标)
//vectices  map coorders for 2D

        osg::Vec2Array* texcoords = new osg::Vec2Array(4);
        (*texcoords)[0].set(0.0f,1.0f);
        (*texcoords)[1].set(1.0f,1.0f);
        (*texcoords)[2].set(1.0f,0.0f);
        (*texcoords)[3].set(0.0f,0.0f);

        pShapeGeometry->setVertexArray(myShapeVertices);
重点2:
    几何体绑定贴图坐标:
      pShapeGeometry->setTexCoordArray(0,texcoords);

这种创建有贴图的几何体,教程和网上有很多例子参看!

该用户从未签到

 楼主| 发表于 2013-5-23 22:01:05 | 显示全部楼层
本帖最后由 guch1234 于 2013-5-23 22:07 编辑
VR_user_happy 发表于 2013-5-23 19:57
自动生成,系统怎么知道你个贴图应该怎么绑定到对应的那个顶点?

参看:


嗯,我知道怎么设置顶点坐标数组和纹理坐标数组,但是如果我这个平面,其形状是异形的(20边凹多边形之类的),如果想要得到大小均一的REPEAT贴图,如果用纹理坐标数组的话需要每个点都计算(当然计算也不是很麻烦,就是找个顶点,然后作坐标减法就好了)。
    我只是在想,既然OSG 提供了texgen的这个自动设置纹理坐标的方法,就没有提供类似的绑定方法吗?好吧,我承认是底层实现方面的小白。不知我的以下理解是否正确:
    因为texgen的设置平面是一个绝对坐标的平面,所以其生成的纹理坐标是以这个平面为准的,所以更新回调之后,没有办法保证纹理跟着移动。
   
    如果没有,那我确实只能老老实实计算纹理坐标。

该用户从未签到

发表于 2013-5-24 08:31:05 | 显示全部楼层
加一个 TexMatrix 纹理坐标偏移矩阵

该用户从未签到

 楼主| 发表于 2013-5-24 13:22:48 | 显示全部楼层
liuzhiyu123 发表于 2013-5-24 08:31
加一个 TexMatrix 纹理坐标偏移矩阵

谢谢斑竹,已解决~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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