查看: 1579|回复: 4

关于网格被波动海面穿透

[复制链接]

该用户从未签到

发表于 2011-4-20 10:03:17 | 显示全部楼层 |阅读模式
这几天做的一个网格在海面上漂浮的效果,但发现海面起伏时总是有点穿透网格。代码如下。请教大家。
class DynamicGeomCallBack:public osg:rawable::UpdateCallback
{
public:
DynamicGeomCallBack(osg::ref_ptr<osgOcean::OceanScene> scene):_scene(scene){}
virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawable)
{
  //osg::Matrix mat = osg::computeLocalToWorld(nv->getNodePath());
  osg::Geometry* geome = dynamic_cast<osg::Geometry*>(drawable);
  if (!geome)
   return;
  osg::Vec3Array* vertics = dynamic_cast<osg::Vec3Array*>(geome->getVertexArray());
  if (vertics)
  {
   for (osg::Vec3Array::iterator itr = vertics->begin();itr != vertics->end();++itr)
   {
    float z = _scene->getOceanSurfaceHeightAt((*itr).x(),(*itr).y());
    (*itr).set(osg::Vec3((*itr).x(),(*itr).y(),z+0.5f));
   }
   vertics->dirty();
  }
}
private:
osgOcean::OceanScene* _scene;
};

static osg::ref_ptr<osg::Geode> createWaveGrid(osg::Vec3 boatPos,osg::Vec3 boatToward,osgOcean::OceanScene* scene,float waveWidth = 30.0f,float waveLength = 50.0f)
{
osg:uat qt;
boatToward.normalize();
qt.makeRotate(osg::Vec3(0.0,1.0,0.0),boatToward);
osg::Matrix mt;
mt.makeRotate(qt);
int _numx = (int)(waveWidth/2.0f) ,_numy = (int)(waveLength/2.0f);
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::Geometry> geome = new osg::Geometry;
osg::Vec3Array* vertices = new osg::Vec3Array(_numx*_numy);
float dx = waveWidth/(float)(_numx-1);
float dy = waveLength/(float)(_numy-1);
unsigned int vert_no = 0;
unsigned int vertx_no = 0;
unsigned int iy;
for(iy=0; iy<_numy; ++iy)
{
  osg::Vec3 column = boatPos;
  for(unsigned int ix=0;ix<_numx;++ix)
  {
   (*vertices)[vert_no++] = column*mt;
   if ((ix == 0) && (iy == 0))
   {
    osg::Vec3 a = column;
    std::cout<<a.x()<<"   "<<a.y()<<"   "<<a.z()<<std::endl;
   }
   column.x() += dx;
   column.z() = 0.5f;
  }
  boatPos.y() += dy;
}
geome->setVertexArray(vertices);
for(iy=0; iy<_numy-1; ++iy)
{
  unsigned int element_no = 0;
  osg::DrawElementsUInt* elements = new osg::DrawElementsUInt(GL_TRIANGLE_STRIP, _numx*2);
  unsigned int index = iy * _numx;
  for(unsigned int ix = 0; ix<_numx; ++ix)
  {
   (*elements)[element_no++] = index + _numx;
   (*elements)[element_no++] = index++;
  }
  geome->addPrimitiveSet(elements);
}
geome->setUpdateCallback(new DynamicGeomCallBack(scene));
geome->setUseDisplayList(false);
geome->setUseVertexBufferObjects(true);
geode->addDrawable(geome);
return geode.get();
}

该用户从未签到

发表于 2011-4-21 08:32:16 | 显示全部楼层
  1. float z = _scene->getOceanSurfaceHeightAt
复制代码
这里也许可以适当地把Z提升,以避免Z-Fighting的问题

该用户从未签到

 楼主| 发表于 2011-4-21 09:06:12 | 显示全部楼层
回复 2# array


    提升Z值的方法我做过,但是有个问题就是,我从近处观察发现网格与海面的起伏有所不同,经常在某些地方出现海面顶点上升,而网格下降,所以造成了穿透。但是我从代码这边看不出什么原因,还请大家帮我考虑下出现该问题的可能原因。谢谢。

该用户从未签到

发表于 2011-4-21 13:27:41 | 显示全部楼层
从有限的代码里我也看不出什么东西~~

该用户从未签到

发表于 2015-8-17 22:27:44 | 显示全部楼层
关闭网格geometry的深度测试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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