查看: 2043|回复: 9

Delaunay三角网法线问题

[复制链接]

该用户从未签到

发表于 2012-10-31 17:35:12 | 显示全部楼层 |阅读模式
OSG.png 用Delaunay绘制网格,并设置各个顶点颜色,最终显示的怎么会是这个样子,是因为法线设置的问题吗,法线应该怎么设置呢。。。

该用户从未签到

发表于 2012-11-5 09:41:52 | 显示全部楼层
您什么信息也没有给出来。。。

该用户从未签到

 楼主| 发表于 2012-11-6 09:03:47 | 显示全部楼层
array 发表于 2012-11-5 09:41
您什么信息也没有给出来。。。

这是生成云图主干代码,全部代码放在附件里面了,麻烦您知道知道,,呵呵
osg::ref_ptr<osg::Geometry> create()
{
        osg::ref_ptr<osg::Vec3Array> coords = new osg::Vec3Array();
        osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();

        //计算顶点数组的大小
        unsigned int n = sizeof(vertex)/sizeof(float[4]);
        //求数组差值最大最小值
       
     float max;
         float min;
         float number = 12;
       
         max = maxed(vertex,n);
         min = mined(vertex,n);
         float mm = (max-min)/number;
        //添加顶点数据
        for( unsigned int i = 0; i < n; i++ )
        {
                coords->push_back( osg::Vec3(vertex[0], vertex[1], vertex[2] ));
                if (vertex[3]<=(min+number*mm/4))
                {
                        vc->push_back(osg::Vec4(0.0f,1.0f*255*(vertex[3]-min)/(number*mm/4),1.0f,1.0f));
                }
                if (vertex[3]>min+number*mm/4 && vertex[3]<=min+number*mm/2)
                {
                        vc->push_back(osg::Vec4(1.0f,1.0f,1.0f*(255-255*(vertex[3]-(min+number*mm/4))/(number*mm/4)),1.0f));
                }
                if (vertex[3]>min+number*mm/2 && vertex[3]<=min+number*mm*3/4)
                {
                        vc->push_back(osg::Vec4(1.0f*255*(vertex[3]-(min+number*mm/2))/(number*mm/4),1.0f,1.0f,1.0f));
                }
                if (vertex[3] > min+number*mm*3/4 && vertex[3]<=max)
                {
                        vc->push_back(osg::Vec4(1.0f,1.0f*(255-255*(vertex[3]-(min+number*mm*3/4))/(number*mm/4)),0.0f,1.0f));
                }
        }

        osg::TemplateIndexArray<unsigned int ,osg::Array::UIntArrayType,4,4>* colorIndex = new osg::TemplateIndexArray<unsigned int ,osg::Array::UIntArrayType,4,4>();
        for (unsigned int i=0;i<n;i++)
        {
                colorIndex->push_back(i);
        }
        //创建几何体
        osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
        //设置顶点数组
        geometry->setVertexArray(coords.get());
        geometry->setColorArray(vc.get());
        geometry->setColorIndices(colorIndex);
        geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

        //设置法线
        /*osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();
        nc->push_back(osg::Vec3(0.0f,-1.0f,0.0f));
        geometry->setNormalArray(nc.get());
        geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);*/

        //创建Delaunay三角网对象
        osg::ref_ptr<osgUtil:elaunayTriangulator> dt = new osgUtil::DelaunayTriangulator(coords.get());
        //生成三角网
        dt->triangulate();

        //加入到绘图基元
        geometry->addPrimitiveSet(dt->getTriangles());
        /*geometry->addPrimitiveSet(new osg::DrawArrays(osg:rimitiveSet:UADS,0,n));*/

        //添加到叶节点
        /*osg::ref_ptr<osg::Geode> geode = new osg::Geode();
        geode->addDrawable( geometry.get());
        return geode.get();*/

        osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
        stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::ON);
        geometry->setStateSet(stateset.get());
        return geometry.get();
}

Tex.h

32.45 KB, 下载次数: 12, 下载积分: 威望 1

Trianany.cpp

6.69 KB, 下载次数: 13, 下载积分: 威望 1

该用户从未签到

发表于 2012-11-7 16:57:50 | 显示全部楼层
使用smooth光滑一下

该用户从未签到

 楼主| 发表于 2012-11-8 11:02:16 | 显示全部楼层
osger 发表于 2012-11-7 16:57
使用smooth光滑一下

现在发现问题是:由点插值得到的面的颜色,会中间亮,颜色交界处周围暗,如果点多了且颜色种类多,各个颜色的面积较小时,就会显得模糊,,有没有什么方法可以让面的颜色看的均匀一些,亮度一样,,谢谢呀

该用户从未签到

发表于 2012-11-9 14:29:33 | 显示全部楼层
为什么不直接使用纹理

该用户从未签到

发表于 2012-11-9 17:09:25 | 显示全部楼层
你是不是 光照没打

该用户从未签到

 楼主| 发表于 2012-11-9 22:51:57 | 显示全部楼层
array 发表于 2012-11-9 14:29
为什么不直接使用纹理

请问array老师,纹理应该怎么使用,呵呵。。各个点都有特征值,特征值不同,赋予的颜色值也不同。。

该用户从未签到

 楼主| 发表于 2012-11-9 22:53:18 | 显示全部楼层
osger 发表于 2012-11-9 17:09
你是不是 光照没打

光照开关是开的,可是还是模糊,,呵呵。。主要原因是没一块颜色中心太亮,周围较暗,所以就模糊了。。呵呵

该用户从未签到

发表于 2012-11-10 19:40:53 | 显示全部楼层
差值算法有问题!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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