|
本帖最后由 口口广大 于 2011-11-8 13:24 编辑
osg有个例子如下图,实现了包络体SphereSegment.与地形模型相切。
想实现一个更复杂的效果,即是在生成包络体时,判断地形有否遮挡住该包络体,最后只生成该包络体未被地形遮蔽的部分。
想想原理很简单,查看SphereSegment.cpp,在画surfac的PowerSphereSegment::Surface_drawImplementation源码如下- for(int i=0; i+1<=_density; i++)
- {
- // Because we're drawing quad strips, we need to work out
- // two azimuth values, to form each edge of the (z-vertical)
- // strips
- float az1 = _azMin + (i*azIncr);
- float az2 = _azMin + ((i+1)*azIncr);
- glBegin(GL_QUAD_STRIP);
- for (int j=0; j<=_edensity; j++)
- {
- float elev = _elevMin + (j*elevIncr);
- // QuadStrip Edge formed at az1
- // ----------------------------
- // Work out the sphere normal
- float x = cos(elev)*sin(az1);
- float y = cos(elev)*cos(az1);
- float z = sin(elev);
- glNormal3f(-x, -y, -z);
- glVertex3f(_centre.x() + _radius*x,
- _centre.y() + _radius*y,
- _centre.z() + _radius*z);
-
- // QuadStrip Edge formed at az2
- // ----------------------------
- // Work out the sphere normal
- x = cos(elev)*sin(az2);
- y = cos(elev)*cos(az2);
- // z = sin(elev); z doesn't change
- glNormal3f(-x, -y, -z);
- glVertex3f(_centre.x() + _radius*x,
- _centre.y() + _radius*y,
- _centre.z() + _radius*z);
- }
- glEnd();
- }
- }
复制代码 无非将方位角与俯仰角划分成i*j份,然后每一份根据某个数学公式算出两个点,然后连起来即可。
那么我想有个简单的办法,即判断每一份两点的连线与地形模型是否有交,如果有交就退出当层循环,那么最后画出的片面应该就是未被地形遮挡的片面。
问题就是不知道如何写线段与地形模型相交的函数,呵呵。写了试试如下
- int PowerSphereSegment::computeIntersectionTerrain(osg::Vec3d& start,osg::Vec3d& end)
- {
- int result = 0;
- osgUtil::IntersectVisitor ivXY;
- osg::ref_ptr<osg::LineSegment> lineXY = new osg::LineSegment(start,end);
- ivXY.addLineSegment(lineXY.get());
- _terrainNode->accept(ivXY);
- if (ivXY.hits())
- {
- osgUtil::IntersectVisitor::HitList& hitList = ivXY.getHitList(lineXY.get());
- std::cout<<" hitList SIZE = "<<hitList.size()<<std::endl;
-
- result = hitList.size();
- }
- return 0;
- }
复制代码 执行时报警告如下
Warning: invalid line segment passed to IntersectVisitor::addLineSegment(..)
0 0 0 0 0 0 segment ignored..
不知有何问题?而且我感觉这个osg::Vec3d& start,osg::Vec3d& end是该包络体的局部坐标系,而地形模型则是另一个局部坐标系,两个不同坐标系下的几何体能否直接相交?是不是要矩阵变化什么的的?谢谢! |
|