查看: 1203|回复: 4

关于osgdelaunay的疑问

[复制链接]

该用户从未签到

发表于 2010-8-11 12:00:43 | 显示全部楼层 |阅读模式
osg::Vec2Array *LinearConstraint::getRoadTexcoords(const osg::Vec3Array *points)  {
    // need to create a vec2 array from the coordinates that fits the road
    osg::Vec3Array::const_iterator tritr;//常迭代器,这样就不能修改points里的内容了
    osg::ref_ptr<osg::Vec2Array> tcoords= new osg::Vec2Array ;

    for (tritr=points->begin(); tritr!=points->end();tritr++) {
        osg::Vec2 tci(-1.,-1.);
        int ib=0;
        // osg::Vec3Array *varr=dynamic_cast<osg::Vec3Array*>(getVertexArray());
        bool ptfound=false;
        for (osg::Vec3Array::iterator vit=_edgecoords->begin(); vit!= _edgecoords->end() && !ptfound; vit++) {
            if ((*vit)==(*tritr)) {
                tci=_tcoords->at(ib);
                ptfound=true;
            }
            ib++;
        }///找到特定顶点的纹理坐标

        if (!ptfound) { // search for surrounding points and interpolate
            ib=0;
            osg::Vec3 pminus=(_edgecoords->back()); // need pminus for interpolation
            int ibm1=_edgecoords->size()-1;
            for (osg::Vec3Array::iterator vit=_edgecoords->begin(); vit!= _edgecoords->end() /*&& !ptfound*/; vit++) {
                osg::Vec3 pplus=(*vit)-(*tritr);
                osg::Vec3 dpm=pminus-(*tritr);
                pplus.set (pplus.x(),pplus.y(),0);
                dpm.set (dpm.x(),dpm.y(),0);
                float dprod=pplus*dpm/(pplus.length() * dpm.length());
                if (dprod<-0.9999) { // *tritr lies between....
                    osg::Vec2 tminus=_tcoords->at(ibm1);
                    osg::Vec2 tplus=_tcoords->at(ib);
                    float frac=(dpm.length()/(dpm.length()+pplus.length()));
                    tci=tminus+((tplus-tminus)*frac);
                    ptfound=true;
                }
                ibm1=ib;
                ib++;   
                pminus=(*vit);
            }
        }
        tcoords->push_back(tci);
    }
    // some extra points are not interpolated as they lie between 2 interpolated vertices
    for (tritr=points->begin(); tritr!=points->end();tritr++) {
        int ib=tritr-points->begin();
        osg::Vec2 tci=tcoords->at(ib);
        if (tci.x()<-.99 && tci.y()<-.99) {
            // search through each of the primitivesets
            osg::Vec3Array::const_iterator ptitr;
            //    osg::notify(osg::WARN) << "Not calculated " <<  (*tritr).x() <<"," << (*tritr).y() << std::endl;
            for (ptitr=points->begin(); ptitr!=points->end();ptitr++) {
            }
        }
    }
    return tcoords.release();
}

这个函数里面有些地方不是很好懂,特别是   if (!ptfound) 循环里面的这段代码,如果说它是想得到道路周围的点的纹理坐标,那为什么在里面的
if (dprod<-0.9999) { // *tritr lies between....
                    osg::Vec2 tminus=_tcoords->at(ibm1);
                    osg::Vec2 tplus=_tcoords->at(ib);
                    float frac=(dpm.length()/(dpm.length()+pplus.length()));
                    tci=tminus+((tplus-tminus)*frac);
                    ptfound=true;
                }
里面没有push_back?请研究过这段代码的前辈给我点指导,谢谢了。

该用户从未签到

发表于 2010-8-11 12:20:59 | 显示全部楼层
我不明白这里为什么要有push_back,您想要实现什么功能?

该用户从未签到

 楼主| 发表于 2010-8-11 12:31:16 | 显示全部楼层
2# array
您好,我现在想通过一个中心线来构造一条道路,所以在研究这个例子,我不是很明白这个函数的功能,就是这个函数得到的纹理坐标是哪些点的纹理坐标?还有那个-0.9999是为了得到地形上无限靠近道路的点的纹理坐标吗?如果是的话,那我觉得那个里面就应该有一个push_back把得到的纹理坐标添加进去啊,请您不吝赐教。

该用户从未签到

发表于 2010-8-11 17:12:16 | 显示全部楼层
抱歉我没有研究过相关的代码,在我看来这似乎是为了获取某个计算平均值并把它累加到一些变量中

该用户从未签到

 楼主| 发表于 2010-8-11 20:31:56 | 显示全部楼层
4# array
噢,还是谢谢您,我再去研究下,感觉这个对数学的要求比想象中的还高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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